ASP.net RequiredFieldValidator不阻止回发

时间:2009-03-17 21:29:14

标签: asp.net validation

我有一个问题,关于什么可以阻止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中的东西?

5 个答案:

答案 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”提交表单,我认为验证器不会阻止回发。