为什么asp:UpdatePanel仅在第二次单击按钮时更新hiddenfield值

时间:2013-07-04 13:49:56

标签: c# updatepanel hidden-field

我在按钮点击时更新隐藏字段时遇到问题。当我点击按钮时, 只有当我点击按钮第二次时才会更新第一次时间的hiedenfield 然后我得到了正确的价值。我在网上搜索了这个,我找不到解决方案。有谁知道它为什么会发生,它是默认行为还是有人可以提供一些其他有用的方法来解决这个问题。

.aspx文件:

<asp:ScriptManager ID="scriptManager" runat="server">
</asp:ScriptManager>
<asp:RadioButtonList ID="radioQuestion" runat="server">
    <asp:ListItem Text="first" Value="first"></asp:ListItem>
    <asp:ListItem Text="second" Value="second"></asp:ListItem>
</asp:RadioButtonList>
<asp:UpdatePanel ID="updateResult" runat="server" >
    <ContentTemplate>
        <asp:HiddenField ID="hiddenResult" runat="server" />
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="btnCheck" EventName="Click" />
    </Triggers>
</asp:UpdatePanel>
<asp:Button ID="btnCheck" runat="server" OnClick="btnCheck_Click" Text="Check"
    CssClass="check"  /> 

Javascript代码:

  <script type="text/javascript">
    $(document).ready(function () {
        $('.check').click(function () {
            alert($('#hiddenResult').val());
        });
    });
</script>

.cs文件:

 protected void btnCheck_Click(object sender, EventArgs e)
{
    switch (radioQuestion.SelectedValue)
    {
        case "first":
            hiddenResult.Value = "YES";
            break;
        case "second":
            hiddenResult.Value = "NO";
            break;
    }
}

3 个答案:

答案 0 :(得分:1)

对于这种情况有用的是每次AJAX请求结束时调用的回调机制。幸运的是,有一个可用,可以使用以下方式注册:

   Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler).

稍后,可以实现EndRequestHandler以在请求完成时执行任何javascript代码。参数sender可用于处理特定请求。以下javascript应该用于此目的:

$(document).ready(function () {
   Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
});
function EndRequestHandler(sender, args) {
   var senderId = sender._activeElement.id;
    if (senderId=="btnCheck") {
        alert($('#<%=hiddenResult.ClientID%>').val());
    }
}

更新:刚刚意识到activeElement会为您提供当前处于焦点的表单上的元素,对于这种情况,这不一定是检查的好词。下面是更新的javascript,通过使用_postBackSettings采取更好的方法:

function EndRequestHandler(sender, args) {
   var senderId = sender._postBackSettings.sourceElement.id;
    if (senderId=="btnCheck") {
        alert($('#<%=hiddenResult.ClientID%>').val());
    }
}

答案 1 :(得分:0)

我不知道你要做什么。你仍然可以买这个 1)对于id=updateResult的updatepanel,不需要触发器,因为UpdateMode未设置且默认值始终为true。 2)您正在使用相同的控件更改和检查<asp:HiddenFiled>的值。

这里有什么问题,你的客户端代码在服务器之前调用,这意味着在代码隐藏中设置alert($('#hiddenResult').val());值之前调用<asp:HiddenFiled>。一旦客户端代码通过返回true值(默认情况下在任何/您的情况下为True)调用,请求发送到服务器并且您的btnCheck_Click执行并更改隐藏字段值与最新值。下次等等......你将永远得到更高的价值与上述逻辑。

  

您可以使用

的方法

正如我所说的客户端代码在服务器之前调用,所以将服务器代码移动到客户端,如

   $('.check').click(function () {
        // Get Hidden field
        var hidden = $('[id$=hiddenResult]');

        //Your logic
        if ($('[id$=radioQuestion] input:radio')[0].checked) {
            $(hidden).val('Yes');
        }
        else if ($('[id$=radioQuestion] input:radio')[1].checked) {
            $(hidden).val('No');
        }

        alert($(hidden).val());
  }

不要忘记添加jquery文件以供参考页面标题。

希望这会有所帮助

答案 2 :(得分:0)

每个试图回答我问题的人都帮助了我很多。这就是为什么谢谢大家,但我也要说Saurabh的回答让我找到了正确的解决方案。直到现在我对AJAX还不太了解。回答;实际上Saurabh很接近发现它,只需要很少的修正就可以实现这一点。无论如何,我发布我的工作代码(只是Javascript的一部分):

  $(document).ready(function () {
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
    });

    function EndRequestHandler(sender, args) {
        if (document.getElementById('btnCheck')) {
            alert($('#<%=hiddenResult.ClientID%>').val());
        }
    }