【问题标题】:changing visibility contentplaceholder asp.net not working immediately更改可见性 contentplaceholder asp.net 无法立即工作
【发布时间】:2012-09-28 14:38:32
【问题描述】:

我有一个简单的 asp.net 网页,其中包含 2 个RadioButton 列表。提交表单时,会执行一些更复杂的代码,这需要一些时间(5-10 秒)才能执行。

我想在执行该代码之前简单地更改 2 ContentPlaceHolder 之间的可见性。切换工作,但仅在执行复杂代码之后。

结果是页面冻结并在一段时间后发生变化。

我的aspx代码:

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<asp:PlaceHolder ID="requestpage" runat="server" Visible="true">
    <p>
    </p>
    <h1>
        Navigatie update</h1>
    <p>
    </p>
    <div style="text-align: left; width: 300px">
        <p>
            Kies een site</p>
    </div>
    <p>
        <asp:RadioButtonList ID="pubtargetid" runat="server">
        </asp:RadioButtonList>
    </p>
    <br />
    <br />
    <div style="text-align: left; width: 300px">
        <p>
            Kies een taal</p>
    </div>
    <p>
        <asp:RadioButtonList ID="chosenLanguage" runat="server">
        </asp:RadioButtonList>
    </p>
    <p style="color: red">
        <asp:Label ID="errorMessage" runat="server"> </asp:Label></p>
    <p>
        <asp:Button Text="Start update" OnClick="Submit" runat="server" />
    </p>
</asp:PlaceHolder>
<asp:PlaceHolder ID="responsepage" runat="server" Visible="False">
        <p>
        </p>
        <h1>
            Navigatie update</h1>
        <p>
            Navigatie wordt geüpdate</p>
        <p>
</asp:PlaceHolder>

我的代码:

using System;
using System.Web.UI.WebControls;
using System.Threading;
using Tridion.ContentManager.CommunicationManagement;
using Tridion.ContentManager;

namespace CustomPages
{
    public partial class Navigation : System.Web.UI.Page
    {
        private Session session;
        protected void Page_Load(object sender, EventArgs e)
        {
            session = new Session(Request.ServerVariables["LOGON_USER"]);
            Response.BufferOutput = true;
            Response.Flush();

            if (!Page.IsPostBack)
            {
                var targets = session.SystemManager.GetPublicationTargets();
                pubtargetid.Items.Clear();
                foreach (PublicationTarget t in targets)
                {
                    var radio = new ListItem(t.Title, t.Id);
                    pubtargetid.Items.Add(radio);
                }
                chosenLanguage.Items.Clear();
                var nl = new ListItem("NL", "NL");
                var fr = new ListItem("FR", "FR");
                chosenLanguage.Items.Add(nl);
                chosenLanguage.Items.Add(fr);
            }
        }

        public void Submit(object sender, EventArgs e) // --> when submitting the form
        {
            if (pubtargetid.SelectedIndex != -1 && chosenLanguage.SelectedIndex != -1)
            {
                requestpage.Visible = false;
                responsepage.Visible = true;
                Response.Flush();

                String pageId ="";

                String target = pubtargetid.SelectedItem.Value;
                String lang = chosenLanguage.SelectedItem.Value;

                //some code//

                var nav = new Automations.Navigation(session,page);
                nav.CheckPage(pageId, target);         //  --> complex piece of code
            }
            else
            {
                errorMessage.Text = "";
                if (pubtargetid.SelectedIndex == -1)
                {
                    errorMessage.Text += "Choose a publication target. \n";
                }
                if (chosenLanguage.SelectedIndex == -1)
                {
                    errorMessage.Text += "Choose a language.";
                }
            }
        }
    }
}

简而言之:我想在执行复杂代码之前让可见性发生变化。

我尝试了不同的选择;就像尝试刷新响应,但我没有成功,使用Response.BufferOutput = false 和另一次= true,但仍然不成功!

非常感谢您对此问题的任何帮助!

【问题讨论】:

  • 为什么不在回发之前更改客户端的可见性?!

标签: asp.net response visibility flush contentplaceholder


【解决方案1】:

你必须做两件事

将您的PlaceHolder 替换为Panel。 (因为PlaceHolder 不会渲染到任何 HTML 标签,它只是按原样渲染它的内容,但是我们必须获取一些父标签,以便我们可以隐藏显示客户端,所以使用 Panel 渲染为 @ 987654326@).

这样做。

<asp:Panel runat="server" ID="Panel1" Style="display: none;">
     Place Holder one
</asp:Panel>
<asp:Panel runat="server" ID="Panel2">
     Place Holder two
</asp:Panel>
<asp:Button runat="server" ID="btn" OnClientClick="hideOne();" 
            OnClick="server_click" />

<script type="text/javascript" language="javascript">
function hideOne() {
    var one = document.getElementById('<%= Panel1.ClientID %>');
    one.style.display = 'block';
    var two = document.getElementById('<%= Panel2.ClientID %>');
    two.style.display = 'none';
}
</script>

protected void server_click(object sender, EventArgs e)
{
   Response.Write("Hid");
}

基本上你应该在客户端执行隐藏功能,然后再执行你需要的冗长代码

【讨论】:

  • 对这个答案补充一点说明:你的代码是在服务器上执行的,处理完成后返回给浏览器。这还包括面板的可见性设置,无论您是在长时间计算之前还是之后进行。解决方案是在服务器端进行长时间计算之前设置面板可见性,最简单的方法是在按钮的OnClientClick 中使用 javascript 函数。这是在回发(因此是长计算)完成之前评估的。
  • 我还看到你打电话给Response.Flush,可能是为了在计算之前发送你的可见性更新。但是,响应刷新不能以这种方式工作,请阅读此问题的答案:Use of Response.Flush before Response.End
猜你喜欢
  • 2014-05-12
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
相关资源
最近更新 更多