Задайте asp:CustomValidator текст от codebehind

Имам полета за потребителско име и парола, като и двете работят добре с RequiredFieldValidator. Точно под това поставих CustomValidator и се опитвам да получа подобна проверка от задния код, когато паролите не съвпадат.

<asp:RequiredFieldValidator runat="server" ID="PWRequired"   
    ControlToValidate="PasswordTextbox"  
    Display="None"  
    ErrorMessage="<b>Required Field Missing</b><br />A password is required." />
<asp:CustomValidator runat="server" ID="PWMatch"
    ControlToValidate="PasswordTextbox"  
    Display="None"
    ErrorMessage="<b>Password is Invalid</b><br />Please enter a valid password." />
<AjaxControl:ValidatorCalloutExtender 
    runat="Server"
    ID="PWValidationExtender"
    TargetControlID="PWRequired" 
    Width="185px"
    WarningIconImageUrl="/Images/warning.gif" />
<asp:TextBox ID="PasswordTextbox" runat="server" CssClass="passwordEntry" TextMode="Password"></asp:TextBox>

(Надявам се, че е форматирано правилно. Никога не съм успявал да проработи нещото „4 интервал“.

След това в кода отзад, когато PW не съвпадат, опитвам това:

CustomValidator myValidator = (CustomValidator)this.FindControl("PWMatch");
myValidator.Text = "<b>Password is Invalid</b><br />Please enter a valid password."; 
ValidatorCalloutExtender myValExtender = (ValidatorCalloutExtender)this.FindControl("PWValidationExtender");
myValExtender.ID = "PWValidationExtender";
myValExtender.TargetControlID="PWMatch";
myValExtender.WarningIconImageUrl = "/Images/warning.gif";
myValExtender.Width = new Unit(250);

Надявам се да е нещо просто и глупаво, което пропускам. Изгорих цял ден, опитвайки се да разбера това.

Благодаря ви предварително за помощта.

=========================================================================

Благодаря freefaller. Опитах това и получих "няма радост". И така, идвам към него от малко по-различна посока.

Промених на CompareValidator, като този: (отново, надявам се маркирането да работи)

<asp:CompareValidator runat="server" ID="PWCompareValidator"
    ControlToValidate="PasswordTextbox"
    Operator="Equal"
    ValueToCompare="<%# GetPassword() %>"
    Text="<b>Password is Invalid</b><br />Please enter a valid password."
    Type="String" />

Дава ми съобщение, но винаги оценява като „false“, защото методът GetPassword не се извиква. Ако продължа да се натъквам на това, мисля, че мога да го накарам да работи, но ако видите бързо решение, аз съм целият в ушите. Благодаря отново!!


person DJGray    schedule 13.11.2012    source източник


Отговори (1)


Вместо .Text използвайте .ErrorMessage

Така че смени...

myValidator.Text = "<b>Password is Invalid</b><br />Please enter a valid password."; 

To...

myValidator.ErrorMessage = "<b>Password is Invalid</b><br />Please enter a valid password."; 

Актуализация (поради въпросна актуализация)

CompareValidator е проектиран да сравнява две стойности на действителния уебсайт... ValueToCompare трябва да е статична стойност и като поставите паролата в нея, вие отваряте дупка в сигурността (защото потенциално ще изпратите паролата към браузъра - въпреки че имам съмнения, че ValueToCompare="<%# GetPassword() %>" всъщност ще работи на първо място.)

CustomValidator изисква да предоставите поне един манипулатор... определено един на сървъра (използвайки атрибута OnServerValidate), и ако е необходимо, един в браузъра (използвайки атрибута ClientValidationFunction). В рамките на манипулаторите трябва да зададете атрибута IsValid на параметъра args според резултата от вашите проверки.

(Казвам „определено един на сървъра“, защото скриптът от страна на клиента е лесен за заобикаляне, така че винаги искате да имате нещо на сървъра, за да хванете всеки, който се опитва.)

Не е 100% ясно какво точно се опитвате да направите или всъщност точно какво имате в момента, така че е трудно да ви дам директен съвет, различен от това, което имам по-горе.


Окончателна актуализация

Тъй като се опитвате да проверите парола, ето пример за това, което според мен ви трябва...

Password: <asp:TextBox runat="server" id="txtPassword"/>
<asp:RequiredFieldValidator runat="server" id="reqPassword"
   ControlToValidate="txtPassword" ErrorMessage="Provide Password" />
<asp:CustomValidator runat="server" id="cusPassword"
   ControlToValidator="txtPassword" ErrorMessage="Incorrect Password"
   OnServerValidate="cusPassword_ServerValidate"/>

След това във вашия код отзад трябва да имате манипулатора

protected void cusPassword_ServerValidate(object sender, ServerValidateEventArgs args)
{
  args.IsValid = (txtPassword.Text == GetPassword());
}
person freefaller    schedule 13.11.2012
comment
Благодаря freefaller. Опитах това и не получавам радост. И така, идвам към него от малко по-различна посока. Добавих новия подход към оригиналната публикация по-горе. - person DJGray; 13.11.2012
comment
@DJGrey - всъщност имаш ли манипулатори на персонализираните си валидатори? Или от страната на сървъра, или от страната на клиента? - person freefaller; 13.11.2012
comment
freefaller - извинявай за невежеството ми. Начинаещ кодер тук. Какво имаш предвид под манипулатор? Подозирам, че имате предвид нещо, за да заснемете и покажете това, което валидаторът връща. Съобщението за грешка вече се показва, но методът GetPassword() в CodeBehind не се извиква. Подозирам, че ако мога да получа върната стойност на низ от този метод, моят CompareEvaluator ще работи. Това валиден подход ли е? - person DJGray; 13.11.2012
comment
Манипулаторът е част от кода, който се извиква, когато системата иска да потвърди. Изисква се, когато се обадите на CustomValidator, защото той не знае какво искате да направите, трябва да му кажете! Също така, освен ако не работите с базирани на шаблон контроли (като Repeater, GridView), не можете да използвате кодови блокове на атрибути към asp контроли (т.е. не можете да имате <asp:Text Text="<%#GetText()%>"/>). Ето защо GetPassword() не се извиква - ако погледнете HTML, изпратен до браузъра, вероятно ще намерите статичния низ на GetPassword() там - person freefaller; 13.11.2012
comment
LOL!! Какво искам да направя: Имам валидиране на UserID/Password от страна на сървъра, но никога не съм бил доволен от съобщенията за грешка, върнати, когато не успее. Просто е грозно. Вчера се натъкнах на ValidationExtender, който изскача атрактивен балон. Работи прекрасно с RequiredFieldValidator, така че исках да направя същото с невалидна парола, невалиден потребителски идентификатор и потребител, който е валиден, но все още не е одобрен за влизане. Когато се появят тези условия за грешка, се надявам, че мога да извадя малък балон точно както прави RequiredFieldValidator. това помага ли - person DJGray; 13.11.2012
comment
@DJGrey, за съжаление не знам нищо за ValidationExtender, така че не мога да помогна. Ако има възможност да проверява валидирането от страна на сървъра, тогава да, вероятно би било възможно... но това, което със сигурност не искате да правите, е да имате проверка от страна на клиента, която включва изпращане на текущата парола до клиента (поради очевидни съображения за сигурност). Съжалявам, ако липсата на знания за контрола ви губи времето - person freefaller; 13.11.2012
comment
Не не не!! Ти си рок звезда!! Наистина оценявам помощта. Ще опитам подхода, който споменахте по-горе. Ще публикувам отново тук с резултатите. - person DJGray; 13.11.2012
comment
Тали-хо!! Сладка. Това работи. Сега мога да намеря начин да го вържа към удължителя, за да получа ефекта на малкия балон. Благодаря отново freefaller. Бяхте много полезни и поучителни. - person DJGray; 13.11.2012
comment
Страхотно - наистина се радвам, че можах да помогна на @DJGray (току-що забелязах, че изписвам сивата част от името ти неправилно - извинения за това). Успех с останалата част от проекта и благодаря за най-добрата оценка за отговор :-) - person freefaller; 13.11.2012