必填字段验证器未触发。

11

我遇到了一个标准的ASP.NET页面的问题,该页面包含一个文本框和一个必填字段验证器。重现步骤非常简单:

  1. 在页面上放置一个文本框
  2. 在页面上放置一个必填字段验证器
  3. 将必填字段验证器指向文本框
  4. 运行应用程序
  5. 从文本框中切换后,必填字段验证器不会显示
  6. 输入文本,然后删除文本,然后再切换,必填字段验证器就会显示出来

无论何时发生postback,必填字段验证器都能正常工作,但似乎客户端代码只有在输入文本(然后删除)之后才会触发。

有没有人有解决方法,而无需自己修改JavaScript代码?

7个回答

4

这种行为是否是设计上的,以抑制验证控件的出现,直到用户输入?

一般来说,当一个控件被点击并且 CausesValidation 属性设置为 true,例如提交按钮,就会调用 Validate() 方法。

无论如何,有一个简单的解决方法,你可以在 Load 事件处理程序中调用页面的 Validate() 函数。这将使得那些急于切换选项卡的用户清楚地知道他们需要输入一些内容。例如:

protected void Page_Load(object sender, EventArgs e)
{
    Validate();
}

我不相信这是设计上的问题。用户已经选中了文本框并将焦点移开了。在单击提交按钮后,他们将被告知它是不正确的,但是他们应该立即得到通知。 - Alistair Doulin
调用 Page.Validate() 是一种选择,但我认为这不太理想,因为这意味着页面将自动显示为“无效”给用户。 - Alistair Doulin
我觉得所有的验证器都是这样工作的。如果你认为这是框架的一个错误,也许你可以考虑提交一个微软连接错误报告? - Jim Burger
我理解您的观点,但是,如果表单为空,则它不是有效的,是吗? - Jim Burger
不要误会我的意思,我同意,但我认为这是 ASP.NET 的尽头,AJAX 工具包则接管了它。 - Jim Burger
谢谢信息,Jim。是的,我认为这值得向微软提出,因为我相信这是一个错误。就我个人而言,我认为ASP.NET应该能够处理这个问题,因为在某些情况下它可以很好地处理,但在其他情况下则不行。如果客户端验证从未触发,我会接受这种情况。 - Alistair Doulin

4

以下是对我之前回答的跟进:

验证操作发生在 onchange 事件中,而不是 onblur。当焦点丢失且控件值已更改时,onchange 触发。

为了在 onblur 事件中触发验证,我在 Page_Load() 中添加了以下代码:

ScriptManager.RegisterStartupScript(this, GetType(), "js" + myTextBox.ClientID,
  "ValidatorHookupEvent(document.getElementById(\"" + myTextBox.ClientID + 
  "\"), \"onblur\", \"ValidatorOnChange(event);\");", true);

适用于ASP.Net 2。


3

您可能会在这里创建一个可用性问题。如果您在失焦时验证必填字段,用户只是通过字段进行标签切换,就会收到很多“必填字段”错误。


2

您是否将EnableClientScript属性/属性设置为true?如果有文本框的默认值,则需要将InitialValue属性设置为该默认值。


EnableClientScript为true。没有默认值,InitialValue绝对是空的。我很想看看其他人是否可以创建一个空白页面并尝试此操作,以查看他们是否与我得到相同的结果。 - Alistair Doulin

0
一个表单可以包含多个验证组。据我所知,只有在 post-back 时才会触发验证,激活相应验证器组的验证器。只有在 post-back 之后,验证器才会添加其客户端 Javascript 验证代码。

1
如果我输入一些文本,然后将其删除并切换到其他选项卡,客户端JavaScript验证代码会正确触发警告。此外,大多数其他验证器都可以正常工作,并正确触发其客户端验证代码。 - Alistair Doulin

0

这就是验证器的工作原理,除非有输入需要验证或者有回发,否则它们不会触发。如果您想要触发验证,您将不得不自己进行验证触发。

我不知道您需要什么样的代码,但它将涉及处理onblur和覆盖评估函数:

function blurred(sender) {
    var validator = sender.Validators[0]
    validator.evaluationfunction(validator);
}

并在文本框上:

<asp:TextBox runat="server" ID="txt" onBlur="blurred(this)"></asp:TextBox>

谢谢Sontek。我不认为添加JavaScript会太难(就像你展示的那样),但在走这条路之前,我只是想检查是否有其他选择 :) - Alistair Doulin
你不必这样做就可以在文本框上实现客户端验证。 - Ben Scheirman

0

我曾经遇到过同样的问题。后来发现需要在脚本管理器中添加一些框架脚本引用。确保你至少在脚本管理器中的“script”标签中有这些脚本引用。

    <asp:ScriptManager ID="ScriptManager1" runat="server" ValidateRequestMode="Enabled" >
        <Scripts>
        <%--Framework Scripts--%>
        <%--<asp:ScriptReference Name="MsAjaxBundle"  />--%>
        <asp:ScriptReference Name="jquery" />
        <asp:ScriptReference Name="jquery.ui.combined" />
        <asp:ScriptReference Name="WebForms.js"  Path="~/Scripts/WebForms/WebForms.js" />
        <asp:ScriptReference Name="WebUIValidation.js"  Path="~/Scripts/WebForms/WebUIValidation.js" />
        <asp:ScriptReference Name="WebFormsBundle" />
        <%--Site Scripts--%>

    </Scripts>
    </asp:ScriptManager>

当你创建一个WebForms应用程序时,.Net会默认创建主页面,你也可以在其中找到这些。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接