0

在单击按钮时更新隐藏字段时出现问题。当我单击按钮时,它不会一次更新 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;
    }
}
4

3 回答 3

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());
    }
}
于 2013-07-04T15:05:05.157 回答
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());
        }
    }
于 2013-07-05T13:10:15.437 回答
0

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

那么这里的故障是,您的客户端代码在服务器之前调用,这意味着在代码隐藏alert($('#hiddenResult').val());设置值之前调用 。<asp:HiddenFiled>一旦客户端代码通过返回真值(在任何/您的情况下默认为真)调用,请求发送到服务器并且您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文件以供参考。

希望这会有所帮助

于 2013-07-04T14:12:06.173 回答