【问题标题】:no postback from asp:HiddenField in asp:UpdatePanelasp:UpdatePanel 中没有来自 asp:HiddenField 的回发
【发布时间】:2026-02-24 21:20:06
【问题描述】:

我有以下情况:

.ascx:

 <script type="text/javascript">
  $(document).ready(function () {
        $('.onoffswitch-checkbox').change(function () {
            if ($(this).is(":checked")) 
                $('#hf').val(1);
            else
                $('#hf').val(0);
        });
  });
 </script>

 <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
 <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="hf"/>
        </Triggers>
        <ContentTemplate>
              <input type="checkbox" class="onoffswitch-checkbox">
              <asp:HiddenField ID="hf" runat="server" Value="0"/>
              <asp:Label ID="label" runat="server" Text=""></asp:Label>
        </ContentTemplate>  
 </asp:UpdatePanel>

.vb:

Protected Sub hf_ValueChanged(ByVal sender As Object, ByVal e As EventArgs) Handles hf.ValueChanged

    label.Text = "something..."

End Sub

JS 函数在 CheckBox 被选中或取消选中后更改 HiddenField 的值,但 HiddenField 的 ValueChaneged-Event 不会触发。我试过asp:PostBackTrigger - 也没有效果,你能看到错误吗?

编辑:

我也尝试在控件中声明方法:

.ascx:

<asp:HiddenField ID="hf" runat="server" Value="0" OnValueChanged="hf_ValueChanged"/>

.vb

 Protected Sub hf_ValueChanged(ByVal sender As Object, ByVal e As EventArgs) 
        label.Text = "something"
 End Sub

没有效果。

【问题讨论】:

  • 查看 firefox web 控制台了解错误。并放入Q中。
  • 控制台没有错误
  • 为什么需要隐藏字段?仅用于标签文本更改?为什么不使用复选框事件?
  • 这是另一个问题的简短示例,我需要这个 HiddenField

标签: asp.net events updatepanel postback hiddenfield


【解决方案1】:

UpdatePanel 在事件方法上有 Response.Write("") 时将不起作用。要更改 UpdatePanel 中元素的值,请尝试使用以下内容:

hf.Value="something";

【讨论】:

  • Response.Write("") 只是一个例子。但我试图在UpdatePanel 中改变一些东西,它也不起作用。我在我的问题中编辑了 quellcode。
【解决方案2】:

亲爱的,你需要在隐藏字段中添加 OnValueChanged 属性并声明方法名称,然后它会触发点击事件。

<asp:HiddenField ID="hf" runat="server" Value="0" OnValueChanged="hf_ValueChanged"/>


void hf_ValueChanged(Object sender, EventArgs e)
{
    // Display the value of the HiddenField control.    
    string _strHDFValue = hf.Value;
    Response.Write("something...")    
}

祝你好运。

【讨论】:

  • 是的发现了另一个丢失的东西,除非你像这样修改你的 JS 代码,否则它不会起作用 "$('#').val(1);"并在 if else 块上执行此操作,我们将能够解决问题。谢谢
  • 很遗憾没有效果
  • 尝试按照这个帮助教程,msdn.microsoft.com/en-us/library/…
  • 本教程中没有UpdataPanel
【解决方案3】:

所以,经过 2 天的实验,我找到了以下解决方法。它不是很漂亮,但它可以像我想要的那样工作。

我不确定,但我认为 JS 仅在客户端站点上更改隐藏字段的值,而服务器看不到更改,因此事件未触发。

一开始我从js手动调用了一个回发:

function changeHFValue(element) {
  if ($(element).is(":checked")) 
     $('#<%= hf.ClientID %>').val(1);
  else 
     $('#<%= hf.ClientID %>').val(0);
   __doPostBack('UpdatePanel1', ''); //postback
}

ascx:

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always" EnableViewState="true">
    <ContentTemplate>
        <asp:HiddenField ID="hf" runat="server"/>
        <input type='checkbox' onchange='changeHFValue(this);' id='cb'/>   
        <asp:Label ID="label" runat="server" Text=""></asp:Label>
     </ContentTemplate>  
</asp:UpdatePanel> 

现在是因为回发而触发的事件,它进入 .vb 中的方法:

 Protected Sub hf_ValueChanged(ByVal sender As Object, ByVal e As EventArgs) Handles hf.ValueChanged
    If hf.Value Then
        label.Text = "something"
    Else
        label.Text = "something else"
    End If
 End Sub  

新问题是,在重新加载 UpdatePanel 后,回发后复选框始终未选中。解决办法是看HiddenField:

$(document).ready(function () {
   // bind your events here initially
   bind();
});

var prm = Sys.WebForms.PageRequestManager.getInstance(); // Page request manager

prm.add_endRequest(function () {
    // re-bind your events here after postback
    bind();
});

function bind() {
    if ($('#<%= hf.ClientID %>').val() == 1) 
       $('#cb').prop('checked', 'checked');
    else 
       $('#cb').prop('checked', '');
} 

【讨论】:

    【解决方案4】:

    如果之后不起作用,请将此属性添加到UpdatePanel标签:

    ChildrenAsTriggers="true"
    

    【讨论】:

      【解决方案5】:

      如果您有Response.*,请查看您的Page_Load,如果有,请在UpdatePanel 引起的负载时避免它。

      【讨论】:

      • 感谢您的回复,但我在此测试页上的 Page_Load 完全空白。我在任何地方都没有回复。