Page.IsValid всегда возвращает true с ValidationGroup и динамическим CustomValidator - PullRequest
0 голосов
/ 20 сентября 2010

Я добавляю пользовательский валидатор на страницу программно по нажатию кнопки, затем проверяю страницу и проверяю свойство IsValid этой страницы. но свойство IsValid всегда возвращает true. Пожалуйста помоги. вот код Мне нужно добавить пользовательский валидатор динамически, чтобы показать сообщения проверки от бизнес-объекта. Я устанавливаю для свойства IsValid пользовательского валидатора значение false, поэтому я ожидаю, что свойство IsValid страницы также вернет false после проверки. не могу понять, что я здесь делаю не так.

    protected void Button1_Click(object sender, EventArgs e)
{
    var validator = new CustomValidator();
    validator.IsValid = false;
    validator.ErrorMessage = "The input is invalid";
    validator.ValidationGroup = "vgCustom";
    Page.Validators.Add(validator);
    ValidationSummary1.ValidationGroup = "vgCustom";
    Page.Validate("vgCustom");
    Label1.Text = Page.IsValid ? "The Page is valid" : "The Page is Invalid";
}

и вот HTML-разметка

<html xmlns="http://www.w3.org/1999/xhtml" >
 <head runat="server">
    <title></title>
 </head>
 <body>
    <form id="form1" runat="server">
    <div>
        <asp:ValidationSummary ID="ValidationSummary1" runat="server"/>
        <asp:Button ID="Button1" runat="server" Text="Validate" OnClick="Button1_Click" />
        <asp:Label ID="Label1" runat="server"></asp:Label>
    </div>
    </form>
 </body>
</html>

Ответы [ 5 ]

3 голосов
/ 05 февраля 2012

У меня была такая же проблема с RequiredFieldValidator (Page.IsValid всегда был верным) у меня была панель, которую я хотел показать, только когда проверка неверна:

<asp:Panel ID="PanelValidationMessage" CssClass="hide messegeFailed" runat="server">
   <p><asp:RequiredFieldValidator ID="RequiredFieldValidatorProductForTransfer" 
                                  runat="server"
                                  ValidationGroup="Transfer"
                                  ErrorMessage="Please Select Product for Transfer"
                                  ControlToValidate="DDLProductForTransfer"
                                  InitialValue="0"
                                  SetFocusOnError="true"
                                  Display="Dynamic"></asp:RequiredFieldValidator></p>

</asp:Panel>

это было решено после того, как я изменил атрибут кнопки * CausesValidation"кнопки с" true"на" false":

<asp:Button ID="BtnTransfer" 
            runat="server" 
            Text="Transfer Products" 
            onclick="BtnTransfer_Click" 
            ValidationGroup="Transfer"
            CausesValidation="false"/>

код позади:

Page.Validate("Transfer");
        if (Page.IsValid)
        {
            PanelValidationMessage.CssClass = "hide messegeFailed";
        }
        else
        {
            PanelValidationMessage.CssClass = "show messegeFailed";
        }
0 голосов
/ 16 октября 2017

Во-первых, я думаю, что проще добавить валидатор в aspx, а не кодовый код. сначала он все равно будет скрыт.

Во-вторых, установите атрибут OnServerValidate = "myControl_OnServerValidate" в вашем aspx. Затем в вашем программном коде реализуйте myControl_OnServerValidate (): ваш код проверки может установить validator.IsValid в значение false. Когда страница проверяется, она автоматически агрегирует значение из вашего валидатора, и Page.IsValid будет установлен в значение false реализацией страницы

ПРИМЕЧАНИЕ: проверка клиента выполняется, и если на клиенте все идет хорошо, выполняется проверка сервера (см. https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.customvalidator.aspx#Remarks)

0 голосов
/ 28 сентября 2016

@ Джеймс неверен, вам нужно добавить CausesValidation="true" к вашей кнопке.

0 голосов
/ 21 мая 2012

Вам нужно добавить группу проверки к кнопке, чтобы вызвать ее

0 голосов
/ 21 сентября 2010

BaseValidator.Validate Метод :

Используйте метод Validate для выполнения проверка правильности ввода контроль. Этот метод позволяет вам программно выполнить проверку на контроль ввода. IsValid свойство автоматически обновляется с результаты проверки.

Таким образом, validator.IsValid сбрасывается до значения по умолчанию (True) при вызове Page.Validate("vgCustom"). Принимая во внимание, что с помощью ServerValidateEventHandler ваш код устанавливает IsValid на Page.Validate("vgCustom") вместо , позволяя восстановить его по умолчанию. Если вы переместитесь на validator.IsValid = false после вызова на Page.Validate("vgCustom"), страница не сможет быть подтверждена должным образом.

Я предпочитаю использовать следующий шаблон:

/// <summary>
/// A validator that fails unconditionally. Useful if you need to do
/// validation entirely in the code-behind, yet still integrate with
/// the standard ASP.NET validation framework.
/// </summary>
public class FailValidator : BaseValidator {
    protected override bool ControlPropertiesValid() {
        // make setting ControlToValidate optional
        return true;
    }

    protected override bool EvaluateIsValid() {
        return false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...