【问题标题】:Button.Click event will not fire when text entered in RangeValidator.ControlToValidate在 RangeValidator.ControlToValidate 中输入文本时,Button.Click 事件不会触发
【发布时间】:2011-11-18 11:58:59
【问题描述】:

基于来自MSDN 的示例,我正在尝试使用 RangeValidator 在代码隐藏中验证日期范围

共有三个文本框,一个用于到达日期、出发日期和所需的旅行日期。单击提交按钮后,如果用户在其他两个文本框中指定的范围之外输入了所需的游览日期,则应显示 RangeValidator 的消息。

RangeValidator 的最小值和最大值在按钮的 Click 事件中设置。其 ControlToValidate(所需的游览日期)在标记中设置。

问题是:如果前两个 TextBox 中的任何一个中有文本,则不会触发提交按钮的 Click 事件。如果以任何其他组合输入文本,则会触发事件(尽管显然会引发异常)。

标记:

Arrival date:
<br />
<asp:TextBox ID="txtArrival" runat="server"></asp:TextBox>
<br />
Departure date:
<br />
<asp:TextBox ID="txtDeparture" runat="server"></asp:TextBox>
<br />
Tour date:
<br />
<asp:TextBox ID="txtTourDate" runat="server"></asp:TextBox>
<br />
<asp:RangeValidator ID="RangeValidator1" runat="server"  ControlToValidate="txtTourDate"></asp:RangeValidator> 
<br />
<asp:Button ID="btnSubmit" runat="server" Text="submit"  onclick="btnSubmit_Click"/>

代码隐藏::

protected void btnSubmit_Click(object sender, EventArgs e)
{
    RangeValidator1.MinimumValue = txtArrival.Text;
    RangeValidator1.MaximumValue = txtDeparture.Text;
    RangeValidator1.Type = ValidationDataType.Date;

    RangeValidator1.Validate();

    if (!RangeValidator1.IsValid)
    {
        RangeValidator1.ErrorMessage = "The tour date must fall between " + txtArrival.Text + " and " + txtDeparture.Text;
    }
}

编辑:感谢您的回答,但事实证明我没有将 RangeValidator 的 EnableClientScript 属性设置为“false”。新规则 - 我要等 30 分钟再提问 :)

【问题讨论】:

    标签: c# asp.net .net validation rangevalidator


    【解决方案1】:

    您需要在 RangeValidators 属性中设置最小值和最大值,它会验证输入,如果没有错误则启用可以创建回发的控件。

    【讨论】:

    • @dbr:JavaScript 验证发生在page lifecycle 中的任何代码隐藏事件之前
    【解决方案2】:

    您需要在客户端设置 RangeValidators min max 属性。您可以调用提交按钮的 javascript 函数 OnClientClick。您可以从此处设置 RangeValidator 的 Min Max 值。 像这样:

    <asp:Button ID="btnSubmit" runat="server" Text="submit" OnClientClick="return SetProperties();" onclick="btnSubmit_Click"/> 
    
    <script type="text/javascript">
        function SetProperties()
        {
            var r = document.getElementById("RangeValidator1");
            r.MaximumValue = document.getElementById("txtDeparture").value;
            r.MinimumValue = document.getElementById("txtArrival").value;
            r.ControlToValidate = "txtTourDate";
        }
    </script>
    

    【讨论】:

    • 当可以在验证器的属性中设置属性时,如何在 JavaScript 中设置属性?
    • 是的,你可以设置,但你应该在客户端而不是在服务器端设置它们。如果你在服务器端这样做,那么为什么要使用范围验证器?因为它本质上是在客户端进行验证。现在范围验证器的 min 和 max 属性绑定到 txtArrival 和 txtDeparture。所以我使用了设置属性功能。
    【解决方案3】:

    您好,请删除 dipslay="dynamic" 并尝试您的代码可能会按预期工作:由于第一次点击,后面的代码被调用,如果您使用 Panel 和 Telerik 控件进行异步渲染,基本上会发生这种情况

    【讨论】:

      猜你喜欢
      • 2013-06-19
      • 2012-05-06
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多