CustomValidator не работи добре

Имам следното парче asp:

<asp:ValidationSummary ID="RegisterUserValidationSummary" runat="server" CssClass="failureNotification" 
        ValidationGroup="RegisterUserValidationGroup"/>

...

<asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserNameTB">Username:</asp:Label>
<asp:TextBox ID="UserNameTB" runat="server" CssClass="textEntry"></asp:TextBox>
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" ControlToValidate="UserNameTB" 
      ValidationExpression="[a-zA-Z]{3,8}" ErrorMessage="Username must be between 3 to 8 chars" runat="server"
      CssClass="failureNotification" ToolTip="Username must be between 3 to 8 chars" ValidationGroup="RegisterUserValidationGroup">
    *</asp:RegularExpressionValidator>
<asp:CustomValidator ID="NoUserValidator" ControlToValidate="UsernameTB" runat="server" ErrorMessage="User Taken!" CssClass="failureNotification" 
      ValidationGroup="RegisterUserValidationGroup"  OnServerValidate="UserValidate">*</asp:CustomValidator>

И след това функцията:

protected void UserValidate(object source, ServerValidateEventArgs args)
    {
        SqlDataSource1.SelectCommand = "SELECT ClientID FROM [Clients] WHERE Username= '" + UserNameTB.Text + "'";
        DataView dv = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);
        if (dv.Table.Rows.Count != 0)
            args.IsValid = false;
        else
            args.IsValid = true;
    }

Бутон:

<asp:Button ID="CreateUserButton" runat="server" CommandName="MoveNext" Text="Create User" 
       ValidationGroup="RegisterUserValidationGroup" 
       onclick="CreateUserButton_Click"/>

Проблемът е, че въпреки че функцията за персонализиран валидатор е извикана и задава .IsValid на false, логиката на бутона продължава да работи!


person RanH    schedule 16.06.2012    source източник
comment
Не съм сигурен дали си струва нещо, но също се опитах да задам NoUserValidator.IsValid = false   -  person RanH    schedule 16.06.2012
comment
Не виждам бутона във вашето маркиране, но се уверете, че неговата ValidationGroup е зададена на вашата RegisterUserValidationGroup.   -  person Gloopy    schedule 16.06.2012
comment
Добавих кода на бутона към съобщението   -  person RanH    schedule 16.06.2012


Отговори (1)


Във вашата функция onclick за бутона добавете проверка, за да видите дали страницата е валидна

protected void CreateUserButton_Click(object sender, EventArgs e)
{
    if (Page.IsValid)
    { 
        // Create the user
    }
}

Това трябва да го направи. Това е така, защото вашият персонализиран валидатор е настроен да проверява на сървъра по време на обратното изпращане. Това, което се случва, е, че кодът първо изпълнява кода на валидатора UserValidate, където задавате флага IsValid. Следващата в стека за обратно изпращане е функцията onclick на бутона. Тази функция ще се изпълнява независимо от резултата във функцията валидатор, така че тук трябва да проверите стойността на флага IsValid. Това е поведението, когато валидирате персонализираната контрола за валидиране от страната на сървъра.

Алтернатива е валидирането от страна на клиента. Ако погледнете изходния код на страницата, генериран от вашия браузър, ще видите, че Javascript е добавен за RegularExpressionValidator. Поведението му е известно и се обработва от страна на клиента, така че не се изисква обратна публикация за оценка на израза и валидиране на страницата (всичко се обработва от javascript). Функцията за персонализиран валидатор не е известна, така че се изисква обратно изпращане, освен ако не дефинирате сами скрипт за валидиране от страна на клиента.

Ето връзка към повече информация относно MSDN.

person The Jonas Persson    schedule 16.06.2012
comment
Благодаря, поправи го, можете ли да обясните защо работи добре с другите валидатори, а за персонализирания трябваше да добавя това, което сте написали? - person RanH; 16.06.2012
comment
Всъщност не съм сигурен, така че просто ще гадая, но мисля, че е така, защото другите валидатори валидират от страна на клиента, докато персонализираният валидатор валидира от страна на сървъра. Тъй като това е от страна на сървъра, обратното изпращане вече е започнало и вие първо изпълнявате своя персонализиран валидатор, след това функцията за щракване на бутона. Има ли логика в това? - person The Jonas Persson; 16.06.2012
comment
Начинът, по който го описвате, има смисъл, но бих очаквал страницата да изчака одобрението на всички валидатори, преди да продължи, и освен това всички останали също са конфигурирани да runat= сървър, но може би това няма значение за тях? - person RanH; 16.06.2012
comment
Това, че са настроени на runat=server, означава само, че сървърът ги е генерирал и че можете да получите достъп до тях в кода отзад. Но ако погледнете изходния код на страницата, генериран от вашия браузър, ще видите, че са добавени javascripts за валидатора на регулярен израз. Поведението му е известно, така че не се изисква обратна публикация, за да се оцени изразът и да се потвърди страницата (всичко се обработва от javascript). Функцията за персонализиран валидатор не е известна, така че се изисква обратно изпращане (освен ако не настроите клиентски скрипт за валидиране в javascript). - person The Jonas Persson; 16.06.2012
comment
Благодаря. Това наистина ми помогна. Случайно да имате MSDN справка за него? Или друга препратка към статия/блог? - person LCJ; 12.12.2012
comment
Тази връзка го описва доста добре http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.customvalidator(v=vs.80).aspx - person The Jonas Persson; 13.12.2012