我有一个问题,关于什么可以阻止RequiredFieldValidator阻止回发。
我开始研究一个较旧的,但是简单的aspx表单和我的前任使用手动,服务器端表单验证(检查一些表单字段是否有值,如果没有在标签中显示错误消息)。我以为我会清除一些不需要的代码并用RequiredFieldValidator控件替换手动检查,但是虽然它们似乎在验证,但它们并没有阻止回发。即,我显示了我的错误消息但仍然发生了回发。
表单非常简单,并且没有设置CausesValidation =“false”属性。我的控件看起来像:
<asp:TextBox ID="txtPhone" Runat="server" Columns="20" MaxLength="20" />
<asp:RequiredFieldValidator ID="rfvPhone" runat="server" Display="Dynamic"
ErrorMessage="* Required" ControlToValidate="txtPhone" />
我在同一个项目中创建了一个全新的webform,只有一个文本框,验证器和提交按钮,它的行为方式相同。显示错误消息但仍会发生回发。
是否存在导致此行为的全局或项目范围设置? web.config或global.asax中的东西?
答案 0 :(得分:33)
呼。好的,我发现了这个问题,基本上是通过创建一个全新的项目并将其web.config与我的旧项目进行逐行比较。原来是罪魁祸首:
<xhtmlConformance mode="Legacy"/>
如果删除该行,我的验证将按照我预期的方式工作。谷歌上发现了一些博客文章,关于当将.net 1.1的网络应用程序升级到.net 3.5时,VisualStudio如何将该行添加到web.config中。
博客文章主要是抱怨该字段如何干扰.net的AJAX内容,但我猜测它以类似的方式为RequiredFieldValidator发出的JavaScript混乱。
答案 1 :(得分:10)
验证可以在客户端上(如果可用)或在服务器上进行。验证器的工作不是阻止回发,而是验证输入。
确保您启用了javascript,并尝试将“EnableClientScript”显式设置为true。
在代码隐藏中,您永远不应相信验证器在客户端上进行验证,并始终使用"if Page.IsValid"
。
答案 2 :(得分:4)
我遇到了同样的问题,但结果却完全不同了。我还从服务器端硬编码验证升级到.NET验证。
我的案例中的问题与MSDN文章URL Rewriting in ASP.NET中使用的ASP.NET重写引擎有关。使用“无操作表单”的默认实现是罪魁祸首 - 显然这个是基于早期版本的.NET编写的,表单上的JavaScript阻止了回发没有被发送到输出,因为它丢失了代码
无论如何,如果其他人正在使用此重写引擎,解决方案是将ActionlessForm的默认实现更改为以下内容:
Public Class Form
Inherits System.Web.UI.HtmlControls.HtmlForm
Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
MyBase.Render(New ActionlessFormHtmlTextWriter(writer))
End Sub
End Class
Public Class ActionlessFormHtmlTextWriter
Inherits HtmlTextWriter
Sub New(ByVal writer As HtmlTextWriter)
MyBase.New(writer)
Me.InnerWriter = writer.InnerWriter
End Sub
Sub New(ByVal writer As System.IO.TextWriter)
MyBase.New(writer)
MyBase.InnerWriter = writer
End Sub
Public Overrides Sub WriteAttribute(ByVal name As String, ByVal value As String, ByVal fEncode As Boolean)
Dim Context As HttpContext = HttpContext.Current
'Skip the action attribute of the form control.
If Not (name = "action") OrElse Not Context.Items("ActionAlreadyWritten") Is Nothing Then
MyBase.WriteAttribute(name, value, fEncode)
Else
Context.Items("ActionAlreadyWritten") = True
End If
End Sub
End Class
这样做只是简单地使用action属性,但允许框架中的任何其他逻辑运行。如果Microsoft决定再次更改表单,则此应该以后证明这一点。
答案 3 :(得分:0)
您可以尝试使用RequiredFieldValidator的显式EnableClientScript="True"
参数吗?
答案 4 :(得分:0)
如果您在文本框中按“Enter”提交表单,我认为验证器不会阻止回发。