添加客户端更改事件后,ASP.NET文本框不会回发

时间:2013-10-23 17:17:26

标签: c# jquery asp.net

我的Web表单上有一个ASP.NET文本框,我使用以下代码将其转换为jQuery DatePicker:

$('#<%= txtServiceDateRequested.ClientID %>').datepicker();

那部分工作正常。我还将AutoPostBack属性设置为True,这样无论何时选择日期,页面都会回发。这也很好。我遇到的问题是我试图在页面回发时禁用我的其他控件。我正在使用此代码:

    $(function() {
        $('#<%= txtServiceDateRequested.ClientID %>').change(function () {
            $('#<%= ddlTimeRequested.ClientID %>').prop('disabled', true);
            $('#<%= ddlServiceType.ClientID %>').prop('disabled', true);
            $('#<%= ddlService.ClientID %>').prop('disabled', true);
            $('#<%= ddlGenderRequested.ClientID %>').prop('disabled', true);
            $('#<%= txtServiceDateRequested.ClientID %>').attr('disabled', true);
        });
    });

所以我绑定到我的文本框(datepicker)的change事件。当我添加这段代码时,确实会禁用我应该控制的控件,它似乎会进行回发,但是当我在我的C#代码上放置一个断点时:

protected void txtServiceDateRequested_TextChanged(object sender, EventArgs e)
{
    FixItems(); // I'm putting a breakpoint here
}

由于某种原因,断点永远不会被击中。如果我注释掉上面的javascript代码绑定change事件并禁用控件,那么断点会按预期命中。当我取消注释并启用上面的JS代码时,有人能告诉我为什么我的断点不会被击中吗?

编辑:

在做了一些游戏后,问题似乎是文本框本身被禁用。根据我的推测,我点击了文本框,我的jquery日历出现了。然后我选择了一个日期。然后看来我的禁用代码正在执行,然后jquery尝试将我选择的日期插入到文本框中。但由于文本框已禁用,因此不会将新日期放在那里。所以,在我的禁用代码被触发之前,我可能需要一种方法来使jquery日历代码先执行?

3 个答案:

答案 0 :(得分:1)

您只需为文本框添加AutoPostBack="true"即可。我已经使用以下代码进行了测试:

<html xmlns="http://www.w3.org/1999/xhtml">

            

 <script type="text/javascript">
     $(function () {
         $(".datepicker").datepicker({
             onSelect: function () {
                 this.fireEvent && this.fireEvent('onchange') || $(this).change();
             }
         });
     });
</script>
</head>
<body>

<form id="form1" runat="server">
<div>
    <asp:TextBox ID="TextBox1" runat="server" CssClass="datepicker"                   
     OnTextChanged="TextBox1_TextChanged" AutoPostBack="true"></asp:TextBox>
</div>
</form>
</body>
</html>

答案 1 :(得分:0)

更改方法将覆盖ASP.NET中的默认事件__doPostBack,然后它将永远不会调用服务器。

您应该使用 Bind 来将另一个函数附加到更改方法:

$('#<%= txtServiceDateRequested.ClientID %>').bind( "change", function( event ) {
  // do stuff
});

答案 2 :(得分:0)

不是在更改事件触发时禁用控件,而是将其添加到onCloseonSelect。 所以你的代码看起来像

    $("#<%= txtServiceDateRequested.ClientID %>").datepicker({
       onClose: function( selectedDate ) {
                     $('#<%= ddlTimeRequested.ClientID %>').prop('disabled', true);
                     $('#<%= ddlServiceType.ClientID %>').prop('disabled', true);
                     $('#<%= ddlService.ClientID %>').prop('disabled', true);
                     $('#<%= ddlGenderRequested.ClientID %>').prop('disabled', true);
                     $('#<%= txtServiceDateRequested.ClientID %>').attr('disabled', true);
        }
    });