【问题标题】:ASP.net RequiredFieldValidator not preventing postbackASP.net RequiredFieldValidator 不阻止回发
【发布时间】:2010-10-13 22:55:08
【问题描述】:

我有一个关于什么可以阻止 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" />

我在同一个项目中创建了一个全新的网络表单,只有一个文本框、验证器和提交按钮,它的行为方式相同。错误消息显示,但回发仍然发生。

是否存在会导致此行为的全局或项目范围设置? web.config 或 global.asax 中有什么东西?

【问题讨论】:

  • 我在挂接到我的 asp:button 的 onClientClick 事件时遇到了这个问题。如果有一种方法可以对事件进行排序并保留 asp.net 首先添加的事件,假设它会取消以下事件,那么就可以了。

标签: asp.net validation


【解决方案1】:

哇。好的,我发现了问题,基本上是通过创建一个全新的项目并将其 web.config 与我的旧项目逐行比较。原来罪魁祸首是这样的:

 <xhtmlConformance mode="Legacy"/>

如果我删除该行,我的验证会按照我预期的方式进行。谷歌搜索发现了一堆关于 VisualStudio 如何在将 Web 应用程序从 .net 1.1 升级到 .net 3.5 时将该行添加到 web.config 的博客文章。

博客文章主要抱怨该字段如何干扰 .net 的 AJAX 内容,但我猜它会以类似的方式与为 RequiredFieldValidator 发出的 JavaScript 混淆。

【讨论】:

  • 哇。只是……哇。我以前怎么从来没有遇到过这种情况?这是一个大问题,因为服务器端验证不会阻止任何事件触发,只会设置 IsValid 属性。基本上,我一直在编写错误的 ASP.NET 代码。 :|
  • 这比我承认的在我们的应用程序中发现验证问题的原因花费的时间要长得多。
  • 我花了很长时间试图解决这个问题....仅供其他用户使用,这条线在 IE 中运行良好,但删除了对 chrome、FF 和 opera 的修复。
  • 应该注意的是,ScottGu 建议这样做,除非您根据weblogs.asp.net/scottgu/… 知道您的网站和 xhtml 存在问题。
  • 我很高兴我偶然发现了这个。我一直在向我的验证功能添加调试行但无济于事。它们会在手动调用时触发,但不会自动触发。这解决了它。我正在搜索ClientValidationFunction not firing Chrome Firefox
【解决方案2】:

验证可以在客户端(如果可用)或服务器上进行。验证器的工作不是阻止回发,而是验证输入。

确保您已启用 javascript,并尝试将“EnableClientScript”显式设置为 true。

在代码隐藏中,您永远不应相信验证器正在客户端上进行验证,并且始终使用"if Page.IsValid"

【讨论】:

  • 嗯...我可以并且会更改它以检查表单是否有效,但我很想知道为什么这个项目的行为与我创建的 Web 项目不同。
  • 您的验证器是否有可能以编程方式设置为 Visible="false",或者您的按钮单击正在调用从 javascript 手动提交的表单(从而绕过 DoPostBackWithOptions() 客户端调用)?
  • 不——我在同一个项目中创建了一个全新的表单来测试它,新表单表现出相同的行为。
  • 这个建议对我有帮助!谢谢。
  • 有时防止回发确实很有帮助。例如,回发会导致 FilePickers 丢失任何选定的文件。
【解决方案3】:

我遇到了同样的问题,但结果却大相径庭。我还从服务器端硬编码验证升级到 .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

这只是简单地抑制动作属性,但允许框架中的任何其他逻辑运行。这应该在未来证明这一点,以防 Microsoft 决定再次更改表单。

【讨论】:

  • 我遇到了完全相同的问题!感谢您的发帖,我要花很长时间才能找到问题。
【解决方案4】:

如果您在文本框中按“Enter”来提交表单,我认为验证器不会阻止回发。

【讨论】:

    【解决方案5】:

    您能否尝试为RequiredFieldValidator 使用显式EnableClientScript="True" 参数?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      相关资源
      最近更新 更多