【问题标题】:ASP.Net CustomValidator in GridView is not firedGridView 中的 ASP.Net CustomValidator 未触发
【发布时间】:2010-11-26 19:11:36
【问题描述】:

我用这个 EditTemplate 在 UpdatePanel 中得到了一个 Gridview:

<edititemtemplate>
    <asp:textbox id="txtDistFrom" runat="server" text='<%# Bind("distFrom") %>' width="30" />
    <asp:CustomValidator ID="valDistFrom" ValidateEmptyText="True" OnServerValidate="valDistFromTo_ServerValidate" ControlToValidate="txtDistFrom" Text="Missing" ToolTip="Invalid" Display="Dynamic" runat="server" />
</edititemtemplate>

还有一个简单的服务器端函数:

Protected Sub valDistFromTo_ServerValidate(ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs)
    Dim cv As CustomValidator = CType(source, CustomValidator)
    Dim gvr As GridViewRow = cv.NamingContainer
    Dim tbV As UI.WebControls.TextBox = gvr.FindControl("txtDistFrom")
    If tbV.Text <> "" Then
        args.IsValid = False
        cv.ErrorMessage = "inhalt ist " & tbV.Text
    End If
End Sub

但是在调试此代码时,无论它做什么,都不会触发服务器端函数。它似乎与gridview有关,所以我不能直接通过它的id访问控件。有什么建议吗?

【问题讨论】:

  • 你的页面是否回发?
  • 是的,但就像 Jan 已经说过的,控件 ID 存在问题。但是如何以编程方式添加 CustomValidators?

标签: asp.net gridview customvalidator


【解决方案1】:

如果您将 VB 修改为:

Protected Sub valDistFromTo_ServerValidate(ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs)
        Dim cv As CustomValidator = CType(source, CustomValidator)
        If args.Value <> "" Then
            args.IsValid = False
            cv.ErrorMessage = "inhalt ist " & args.Value
        End If
End Sub

它应该工作。请注意,我使用的是 args.Value。我在 EditTemplates 中使用 CustomValidators 和 TextBox,并将 ControlToValidate 设置为 TextBox ID 并且它一直有效,但您无法按照您尝试的方式获取 TextBox 对象。我认为这比在TGnat's answer 中建议的搞乱 RowUpdating 事件要简单得多。

【讨论】:

  • 谢谢,这也有效。我第一次在页脚模板中使用该方法也遇到了问题。但是在更新和插入的 Handler 方法中触发 Page.Validate 方法很重要。
【解决方案2】:

我遇到了同样的问题。当我在 customvalidator 中明确设置此属性时,服务器端代码触发:

    EnableClientScript="false"

【讨论】:

    【解决方案3】:

    我也倾向于认为 ControlToValidate 是问题所在。 .NET 会在运行时更改该控件的 ID,而自定义验证器可能无法识别它。

    我会尝试使用 FindControl() 在 RowCreated 或 RowDatabound 上添加 customvalidator

    【讨论】:

      【解决方案4】:

      在这种情况下,您可以使用必填字段验证器。在网格中应该可以正常工作。

      对于服务器端验证,我会将自定义验证器完全移出网格并将 ControlToValidate 属性留空。您可以将验证移至网格的 RowUpdating 事件,并在自定义验证器上设置任何错误消息。请记住适当地设置验证器的 IsValid 属性。

      【讨论】:

      • 谢谢,这也适用于 Gridview 中的 controlValidator。
      【解决方案5】:

      问题与 ControlToValidate 属性有关,因为您的文本框的 ID 未用于重复元素,如 GridView、ListView 和 Repeater。换句话说:您偶然发现了 ASP.NET 引擎的限制。

      不过,我不确定如何解决这个问题。您可以通过将方法附加到 GridView 的 OnRowBound 方法来以编程方式添加 CustomValidator。

      本文可能会提供答案 本文可能会提供答案:Integrating Asp.Net Validation Controls with GridView at run-time

      【讨论】:

      • 如果这是正确的,我根本无法在 gridview 中使用验证控件。其他类型,即 RangeValidator 也具有 ControlToValidate 属性并且它们可以工作。
      猜你喜欢
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多