Как работает 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);
}
Ссылки
Ответы
Ответ 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% и независимо от того, можете ли вы предположить, что прошедшая/неудачная проверка во время начальной проверки все равно проходит/не выполняется во время последующих проверок того же жизненного цикла страницы.