改变可见性contentplaceholder asp.net不能立即工作

时间:2012-10-08 10:46:08

标签: asp.net response visibility flush contentplaceholder

我有一个简单的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.";
                }
            }
        }
    }
}

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

我尝试了不同的选择;比如试图冲洗Respone但我没有成功并且Response.BufferOutput = false和另一次= true,但仍然不成功!

非常感谢任何有关此问题的帮助!

1 个答案:

答案 0 :(得分:1)

你必须做两件事

PlaceHolder替换为Panel。 (因为PlaceHolder没有渲染到任何HTML标记,它只是按原样呈现它的内容,但我们必须得到一些父标记,以便我们可以隐藏show client side,所以使用Panel这是呈现为div)。

这样做。

<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");
}

基本上,您应该在执行需要的效果的冗长代码之前在客户端执行隐藏功能

相关问题