asp:UpdatePanel中的asp:HiddenField没有回发

时间:2014-08-20 08:05:36

标签: asp.net events updatepanel postback hiddenfield

我有以下情况:

的.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

没效果。

5 个答案:

答案 0 :(得分:1)

当事件方法有UpdatePanel时,

Response.Write("")将无效。要更改UpdatePanel中元素的值,请尝试使用以下内容:

hf.Value="something";

答案 1 :(得分:1)

亲爱的,你需要在Hidden Field中添加OnValueChanged属性并声明方法名称,然后它将触发click事件。

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

祝你好运。

答案 2 :(得分:1)

因此,经过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', '');
} 

答案 3 :(得分:0)

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

ChildrenAsTriggers="true"

答案 4 :(得分:0)

如果您有Page_Load,请与Response.*联系,如果是,则UpdatePanel导致加载时应避免使用{。}}。