1

我的 Web 窗体上有一个 ASP.NET 文本框,我正在使用以下代码将其变成 jQuery DatePicker:

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

那部分工作正常。I am also setting the AutoPostBackproperty to True, so that whenever a date is selected, the page will post back. 这也很好用。我遇到的问题是我试图在页面回发时禁用我的其他控件。我正在使用这段代码:

    $(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);
        });
    });

所以我绑定到change我的文本框(日期选择器)的事件。当我添加此代码时,它确实会像它应该那样禁用我的控件,并且它似乎会进行回发,但是当我在后面的 C# 代码上放置一个断点时:

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

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

编辑:

在玩了一些游戏之后,问题似乎出在文本框本身被禁用时。据我推测,我点击了文本框,我的 jquery 日历出现了。然后我选择一个日期。然后似乎我的禁用代码正在执行,然后 jquery 试图将我选择的日期插入到文本框中。但由于文本框被禁用,它并没有将新日期放在那里。所以也许我需要一种方法让 jquery 日历代码在我的禁用代码被触发之前首先执行?

4

3 回答 3

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>
于 2013-10-24T15:51:40.067 回答
0

change 方法是覆盖__doPostBack来自 ASP.NET 的默认事件,然后它永远不会调用服务器。

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

$('#<%= txtServiceDateRequested.ClientID %>').bind( "change", function( event ) {
  // do stuff
});
于 2013-10-23T17:24:28.917 回答
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);
        }
    });
于 2013-10-23T21:12:09.760 回答