Установить текст asp:CustomValidator из кода программной части

У меня есть поля User ID и Password, оба из которых хорошо работают с 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);

Я надеюсь, что это что-то простое и глупое, что мне не хватает. Я сжег целый день, пытаясь понять это.

Заранее спасибо за помощь.

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

Спасибо свободнопадающему. Я пробовал это и не получил "радости". Итак, я подхожу к этому немного с другой стороны.

Я перешел на 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
Спасибо свободнопадающему. Я пробовал это и не получил никакого удовольствия. Итак, я подхожу к этому немного с другой стороны. Я добавил новый подход к исходному сообщению выше. - 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
РЖУ НЕ МОГУ!! Что я хочу сделать: у меня есть проверка идентификатора пользователя/пароля на стороне сервера, но я никогда не был доволен сообщениями об ошибках, возвращаемыми при сбое. Это просто некрасиво. Вчера я наткнулся на ValidationExtender, который поднимает привлекательный воздушный шар. Он прекрасно работает с RequiredFieldValidator, поэтому я хотел сделать то же самое с недопустимым паролем, недопустимым идентификатором пользователя и пользователем, который является действительным, но еще не утвержден для входа в систему. Когда появляются эти условия ошибки, я надеюсь, что у меня появится небольшое всплывающее окно, как это делает RequiredFieldValidator. Это помогает? - person DJGray; 13.11.2012
comment
@DJGrey, к сожалению, я ничего не знаю о ValidationExtender, поэтому ничем не могу помочь. Если у него есть возможность проверить проверку на стороне сервера, то да, это, вероятно, было бы возможно... однако то, что вы, конечно же, не хотите делать, это иметь какую-либо проверку на стороне клиента, которая включала отправку текущего пароля клиенту. (из соображений безопасности). Извините, если мое незнание управления тратит ваше время - person freefaller; 13.11.2012
comment
Нет нет нет!! Ты рок-звезда!! Я очень ценю помощь. Я собираюсь попробовать подход, который вы упомянули выше. Я отпишусь здесь с результатами. - person DJGray; 13.11.2012
comment
Талли-Хо!! Сладкий. Это работает. Теперь я могу найти способ привязать его к удлинителю, чтобы получить эффект маленького шарика. Еще раз спасибо свободнопадающему. Вы были очень полезны и поучительны. - person DJGray; 13.11.2012
comment
Круто - очень рад, что смог помочь @DJGray (я только что заметил, что неправильно написал часть Грея в вашем имени - извините за это). Удачи в остальной части вашего проекта, и спасибо за лучший ответ :-) - person freefaller; 13.11.2012