0

我有以下情况:

.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

没有效果。

4

5 回答 5

1

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

hf.Value="something";
于 2014-08-20T08:19:51.053 回答
1

亲爱的,您需要在隐藏字段中添加 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...")    
}

祝你好运。

于 2014-08-20T08:27:29.347 回答
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', '');
} 
于 2014-08-22T07:05:09.040 回答
0

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

ChildrenAsTriggers="true"
于 2014-08-20T08:30:20.700 回答
0

看看Page_Load你有没有Response.*,如果有的话,当负载由UpdatePanel.

于 2014-08-20T08:45:16.447 回答