我遇到了一个标准的ASP.NET页面的问题,该页面包含一个文本框和一个必填字段验证器。重现步骤非常简单:
- 在页面上放置一个文本框
- 在页面上放置一个必填字段验证器
- 将必填字段验证器指向文本框
- 运行应用程序
- 从文本框中切换后,必填字段验证器不会显示
- 输入文本,然后删除文本,然后再切换,必填字段验证器就会显示出来
无论何时发生postback,必填字段验证器都能正常工作,但似乎客户端代码只有在输入文本(然后删除)之后才会触发。
有没有人有解决方法,而无需自己修改JavaScript代码?
我遇到了一个标准的ASP.NET页面的问题,该页面包含一个文本框和一个必填字段验证器。重现步骤非常简单:
无论何时发生postback,必填字段验证器都能正常工作,但似乎客户端代码只有在输入文本(然后删除)之后才会触发。
有没有人有解决方法,而无需自己修改JavaScript代码?
这种行为是否是设计上的,以抑制验证控件的出现,直到用户输入?
一般来说,当一个控件被点击并且 CausesValidation 属性设置为 true,例如提交按钮,就会调用 Validate() 方法。
无论如何,有一个简单的解决方法,你可以在 Load 事件处理程序中调用页面的 Validate() 函数。这将使得那些急于切换选项卡的用户清楚地知道他们需要输入一些内容。例如:
protected void Page_Load(object sender, EventArgs e)
{
Validate();
}
以下是对我之前回答的跟进:
验证操作发生在 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。
您可能会在这里创建一个可用性问题。如果您在失焦时验证必填字段,用户只是通过字段进行标签切换,就会收到很多“必填字段”错误。
您是否将EnableClientScript属性/属性设置为true?如果有文本框的默认值,则需要将InitialValue属性设置为该默认值。
这就是验证器的工作原理,除非有输入需要验证或者有回发,否则它们不会触发。如果您想要触发验证,您将不得不自己进行验证触发。
我不知道您需要什么样的代码,但它将涉及处理onblur和覆盖评估函数:
function blurred(sender) {
var validator = sender.Validators[0]
validator.evaluationfunction(validator);
}
并在文本框上:
<asp:TextBox runat="server" ID="txt" onBlur="blurred(this)"></asp:TextBox>
我曾经遇到过同样的问题。后来发现需要在脚本管理器中添加一些框架脚本引用。确保你至少在脚本管理器中的“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会默认创建主页面,你也可以在其中找到这些。