ASP.Net CustomValidator в GridView не запускается

У меня есть Gridview в UpdatePanel с этим EditTemplate:

<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, поэтому я не могу получить доступ к элементу управления напрямую по его идентификатору. Какие-либо предложения?


person Ulli    schedule 09.09.2009    source источник
comment
относится ли ваша страница к постбеку?   -  person Jambobond    schedule 09.09.2009
comment
Да, но, как уже сказал Ян, есть проблема с идентификаторами элементов управления. Но как программно добавить CustomValidators?   -  person Ulli    schedule 09.09.2009


Ответы (5)


Если вы измените свой 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. Я использую CustomValidators и TextBox в EditTemplates с ControlToValidate, установленным на идентификатор TextBox все время, и это работает, вы просто не можете получить объект TextBox так, как пытаетесь. Я думаю, что это гораздо проще и намного чище, чем возиться с RowUpdating Event, как это предлагается в ответе TGnat.

person Community    schedule 09.09.2009
comment
Спасибо, это тоже работает. Сначала у меня возникли проблемы с использованием этого метода и в шаблоне нижнего колонтитула. Но важно запустить метод Page.Validate в методах Handler для обновления и вставки. - person Ulli; 10.09.2009

В этом случае вы можете использовать обязательный валидатор полей. Что должно отлично работать в сетке.

Для проверки на стороне сервера я бы полностью переместил пользовательский валидатор за пределы сетки и оставил свойство ControlToValidate пустым. Вы можете переместить свою проверку в событие RowUpdating сетки и установить любые сообщения об ошибках в пользовательском валидаторе. Не забудьте правильно установить свойство IsValid валидатора.

person TGnat    schedule 09.09.2009
comment
Спасибо, это сработало, также с controlValidator внутри Gridview. - person Ulli; 09.09.2009

Проблема связана со свойством ControlToValidate, поскольку идентификатор вашего текстового поля не используется в повторяющихся элементах, таких как GridView, ListView и Repeater. Другими словами: вы наткнулись на ограничение в движке ASP.NET.

Однако я не уверен, как решить эту проблему. Вы могли бы сделать это, добавив CustomValidator программно, присоединив метод к методу OnRowBound GridView.

В этой статье может быть ответ В этой статье может быть ответ: Интеграция элементов управления проверкой Asp.Net с GridView при выполнении. время.

person Jan Aagaard    schedule 09.09.2009
comment
Если это так, я вообще не могу использовать элементы управления проверкой в ​​gridview. Другие типы, например RangeValidator, также имеют свойства ControlToValidate, и они работают. - person Ulli; 09.09.2009

Я также склонен думать, что проблема в ControlToValidate. .NET изменяет идентификатор этого элемента управления во время выполнения, и пользовательский валидатор, вероятно, не улавливает его.

Я бы попробовал добавить customvalidator в RowCreated или RowDatabound, используя FindControl()

person Scott Schulthess    schedule 09.09.2009

У меня такая же проблема. Когда я явно установил это свойство в своем пользовательском валидаторе, сработал код на стороне сервера:

    EnableClientScript="false"
person Mike Brady    schedule 05.03.2012