【问题标题】:ASP.NET update panel doesn't update until second clickASP.NET 更新面板直到第二次单击才会更新
【发布时间】:2014-11-11 08:17:40
【问题描述】:

我已经在网上寻找答案,但是我尝试过的很多都没有奏效。我在页面上有两个按钮,一个“喜欢”和一个“不喜欢”按钮。

当我单击一个按钮时,更新面板不会更新,但该用户的类似数据会插入到数据库中。

当我第二次单击该按钮时,更新面板会刷新并可以继续单击。我希望更新面板在第一次点击时刷新

<form id="Matches" runat="server" class="form-horizontal">

        <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>

        <asp:UpdatePanel ID="VotePanel" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false" >
            <ContentTemplate>

                <div class="row">
              <!-- left column -->
                    <div class="col-lg-12 col-sm-12 col-xs-12">
                        <div class="text-center">
                       ail" />
                            <h1>
                                <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><asp:Label ID="Label2" runat="server" Text="Label"></asp:Label></h1>
                            <div class="btn-group">
                                <asp:Button ID="Button1" runat="server" CssClass="btn btn-default" Text="Like" OnClick="Button1_Click" /><asp:Button ID="Button2" CssClass="btn btn-default" runat="server" Text="Dislike" OnClick="Button2_Click" />
                            </div>
                        </div>
                    </div>
                </div>

            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="Button1" />

                <asp:AsyncPostBackTrigger ControlID="Button2" />
                </Triggers>
        </asp:UpdatePanel> 

C#代码

protected void Button1_Click(object sender, EventArgs e)
        {
            uservote.spAddLike(user.getId(), usermatch.getId());
            VotePanel.Update();

        }
        protected void Button2_Click(object sender, EventArgs e)
        {
            uservote.spAddDislike(user.getId(), usermatch.getId());
            VotePanel.Update();
        }

【问题讨论】:

  • 如果将ChildenAsTriggers 设置为true 会发生什么?还有你在改变什么,你是如何改变更新面板的内容的? uservote.spAddLike 有什么东西吗?
  • 脚本管理器是否需要在表单之外?
  • @JonP 当我将 ChildenAsTriggers 设置为 true 时也是如此。我有另一个获取另一个用户的存储过程。这是Page_Load的顶部
  • 你的问题。 Page_load 在点击事件之前被调用。我会在一个答案中详细说明。
  • @JasonW 我想是的。我遵循了一个教程,他们说把它放在外面。

标签: c# asp.net ajax


【解决方案1】:

从 cmets 到您的问题,您正在调用更新函数 更新数据库之前。您需要更好地了解page life-cycle

您会在页面加载时获得更新的信息,这发生在点击之前。试试下面的

 private void functionToUpdateFields(some arguements)
 {
      /*Call Database and populate form fields*/
 }


 protected void Page_Load(object sender, EventArgs e)
 {
     if (!isPostback)
     {
         functionToUpdateFields(some arguements);
     }
 }

 protected void Button1_Click(object sender, EventArgs e)
 {
        uservote.spAddLike(user.getId(), usermatch.getId());
        functionToUpdateFields(some arguements);
        VotePanel.Update();
 }

 protected void Button2_Click(object sender, EventArgs e)
 {
       uservote.spAddDislike(user.getId(), usermatch.getId());
       functionToUpdateFields(some arguements);
       VotePanel.Update();
 }

当您完成所有这些设置后,在每个事件处理程序上设置断点,并在调试时注意它们发生的顺序。这将为您提供页面生命周期的实际演示。

【讨论】:

  • 响应您建议的编辑,通过删除!isPostback,您将进行两次数据库调用而不是一次并更新字段两次。这表明您的代码有其他问题。
  • 如果我在!IsPostBack 中留下空值,则会将空值插入数据库并且页面不会刷新。我插入了&lt;p&gt;&gt;&lt;%=DateTime.Now.TimeOfDay%&gt;&lt;/p&gt;,这样我就可以看到页面何时更新。我了解您的代码发生了什么。对于Page_Load 加载,您只希望functionToUpdateFields(some arguements); 更新一次,并且按钮在剩余时间更新页面。
猜你喜欢
  • 2011-10-23
  • 1970-01-01
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
相关资源
最近更新 更多