37

我有以下带有RequiredFieldValidator. 该EnableClientScript属性在验证控件中设置为“false”。我也在浏览器中禁用了脚本。

我没有Page.IsValid在后面的代码中使用。不过,当我在文本框中提交没有任何值时,我会得到error message.

从@Dai 的评论中,我知道这可能是一个问题,如果其中有任何代码Page_Loadpostback. 不会引发验证错误。

(但是,对于按钮单击处理程序,无需检查Page.IsValid

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

问题

  1. 为什么服务器端验证之前没有发生Page_Load
  2. 为什么我使用时它工作正常Page.IsValid
  3. 您能否提供对解释这一点的文章的任何参考?(不是说 - 总是使用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)。请参阅CustomValidator 无法正常工作button clickCustom Validator

注意:此处存在客户端验证问题:是否使用 Page_IsValid 或 Page_ClientValidate()(用于客户端事件)

标记

<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>

代码背后

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

参考资料

  1. 我应该总是调用 Page.IsValid 吗?
  2. ASP.NET 验证控件——要点、提示和技巧
  3. CustomValidator 不能正常工作
4

2 回答 2

37

验证发生在 之后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% 取决于您的架构,以及您是否能够假设在初始验证期间通过/失败的验证在同一页面生命周期的后续验证期间仍然通过/失败。

于 2012-12-07T13:06:57.477 回答
1

提交按钮应该具有与验证器控件相同的验证组。例如

 <asp:Button Text=" Submit " runat="server" ID="btnSubmit" OnClick="btnSubmit_Click" ValidationGroup="vgCustomerValidation" />
于 2018-06-13T12:48:09.430 回答