Подтвердить что ты не робот

Как работает page.IsValid?

У меня есть следующий код с RequiredFieldValidator. Свойство EnableClientScript устанавливается как "false" в элементе управления проверки. Также я отключил script в браузере.

Я НЕ использую Page.IsValid в коде позади. Тем не менее, когда я отправляю без каких-либо значений в текстовое поле, я получу error message.

Из комментариев @Dai, я узнал, что это может быть проблемой, если в Page_Load есть код в postback. Ошибок проверки не будет.

(Тем не менее, для обработчика нажатия кнопки нет необходимости проверять Page.IsValid)

if (Page.IsPostBack)
{
    string value = txtEmpName.Text;
    txtEmpName.Text = value + "Appended";
}

Вопрос

  • Почему проверка на стороне сервера не выполняется до Page_Load?
  • Почему он работает нормально, когда я использую Page.IsValid?
  • Можете ли вы предоставить какую-либо ссылку на статью, которая объясняет это? (Не то, что говорит - всегда используйте Page.IsValid, но что-то, что говорит об обязательных сценариях использования Page.IsValid

ОБНОВЛЕНИЕ 1

Обратитесь Валидаторы ASP.NET Общее заблуждение

Page.IsValid доступен только после запуска метода Page.Validate(), который вызывается неявно где-то после Page_Load. Если вы сохраняете всю свою логику в обработчике событий Page_Load (который сильно обескуражен!), Вызовите Page.Validate() перед проверкой Page.IsValid.

Примечание. Рекомендуется не хранить всю логику в Page_Load. Если что-то произойдет в событии нажатия кнопки, переместите его в обработчик события нажатия кнопки. Если что-то произойдет в выпадающем событии, переместите его в раскрывающийся список обработчиков событий смены элементов.

ОБНОВЛЕНИЕ 2

Похоже, нам нужно добавить If(Page.IsValid) в button click также, если мы используем Custom Validator с проверкой на стороне сервера. Refer CustomValidator не работает хорошо.

Примечание. Вопрос валидации на стороне клиента присутствует здесь: Использовать ли Page_IsValid или Page_ClientValidate() (для событий на стороне клиента) p >

MARKUP

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
    alert('haiii');
</script>

</head>
<body>
<form id="form1" runat="server">
<div>
    <asp:ValidationSummary runat="server" ID="vsumAll" DisplayMode="BulletList" CssClass="validationsummary" ValidationGroup="ButtonClick" />
    <asp:TextBox ID="txtEmpName" runat="server"></asp:TextBox>
    <asp:RequiredFieldValidator ID="valEmpName" runat="server" ControlToValidate="txtEmpName"
        EnableClientScript="false" ErrorMessage="RequiredFieldValidator" Text="*" Display="Dynamic"
        ValidationGroup="ButtonClick"></asp:RequiredFieldValidator>
    <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" ValidationGroup="ButtonClick" />
</div>
</form>
</body>
</html>

CODE BEHIND

protected void Button1_Click(object sender, EventArgs e)
{
    string value = txtEmpName.Text;
    SubmitEmployee(value);
}

Ссылки

4b9b3361

Ответ 1

Проверка выполняется после Page_Load, но до обработчиков событий (см. http://msdn.microsoft.com/en-us/library/ms178472(v=VS.100).aspx).

Если ваша кнопка не вызывает проверку, вы должны вручную запустить Page.Validate.

Вы не можете допросить Page.IsValid до тех пор, пока после (1) вы не вызвали бы Page.Validate или (2) элемент управления, который вызывает проверку, был источником/включенным в обратную передачу.

Если требуется, чтобы проверка произошла до запуска обработчиков событий, вы можете использовать:

if (Page.IsPostback) 
{
   Page.Validate( /*Control Validation Group Name Optional*/ );
   if (Page.IsValid)
   {
       //Do some cool stuff
   }
}

Вы также можете рассмотреть возможность перепроектирования, чтобы не требовать этого.

В обработчике событий, который обрабатывает элемент управления, который вызывает проверку, Page.IsValid гарантированно будет доступен. Во всех других случаях, как правило, безопаснее повторно запрашивать подтверждение. Одна модель для обработки представлений в форме с валидаторами:

void btnSubmit_Click(object sender, EventArgs e)
{
   this.UpdateGUIWithSubmitRequest();
   if (Page.IsValid)
   {
      this.ProcessSuccessfulSubmission();
   }
   else
   {
      this.ProcessInvalidSubmission();
   }
}

Если вы используете CustomValidator, который имеет очень дорогой шаг проверки, вы можете подумать о кешировании результата в HttpResponse.Cache, поэтому вам не нужно повторно проверять, происходят ли несколько вызовов в Page.Validate.

void CustomValidator_ServerValidate(object source, ServerValidateEventArgs args)
{
   CustomValidator self = (CustomValidator)source;
   string validatorResultKey = self.ClientID;
   bool? validatorResult = Context.Items[validatorResultKey] as bool?;
   if (validatorResult.HasValue)
   {
      args.IsValid = validatorResult.Value;
      return;
   }

   bool isValid = this.DoSomethingVeryTimeConsumingOrExpensive();
   Context.Items[validatorResultKey] = isValid;
   args.IsValid = isValid;
}

Это, конечно же, зависит от вашей архитектуры на 100% и независимо от того, можете ли вы предположить, что прошедшая/неудачная проверка во время начальной проверки все равно проходит/не выполняется во время последующих проверок того же жизненного цикла страницы.