我在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直接访问控件。有什么建议吗?
答案 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"