GridView中的ASP.Net CustomValidator未被触发

时间:2009-09-09 10:43:09

标签: asp.net gridview customvalidator

我在UpdatePanel中使用此EditTemplate获得了一个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直接访问控件。有什么建议吗?

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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对象。我认为这比上面提到的RowUpdating事件更容易让人感到痛苦和干净。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

我也倾向于认为ControlToValidate是问题所在。 .NET在运行时更改了该控件的ID,自定义验证器可能没有将其提取。

我会尝试使用FindControl()

在RowCreated或RowDatabound上添加customvalidator

答案 4 :(得分:0)

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

    EnableClientScript="false"
相关问题