Page.IsValid如何运作?

时间:2012-12-07 11:46:22

标签: asp.net validation

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

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

根据@Dai的评论,如果Page_Load中有postback中的任何代码在Page.IsValid中执行,我就会发现这可能是一个问题。不会抛出任何验证错误。

(但是,对于按钮点击处理程序,无需检查if (Page.IsPostBack) { string value = txtEmpName.Text; txtEmpName.Text = value + "Appended"; }

Page_Load

问题

  1. 为什么服务器端验证不会在Page.IsValid之前发生?
  2. 当我使用Page.IsValid时,为什么它可以正常工作?
  3. 您能否提供一篇解释此文章的文章? (不是说的话 - 总是使用Page.IsValid;但是说明了使用Page.IsValid
  4. 的强制性方案的内容

    更新1

    参考ASP.NET Validators Common Misconception

      

    Page.Validate()只有在Page_Load之后隐式调用的Page.Validate()方法运行后才能访问。如果您将所有逻辑保存在Page_Load事件处理程序中(非常不鼓励!),请在检查Page.IsValid之前调用Page_Load

    注意:建议不要保留 If(Page.IsValid)中的所有逻辑。如果按钮单击事件发生了某些事情,请将其移动到按钮单击事件处理程序。如果在下拉事件中发生某些事情,请将其移至下拉列表中选择的项目更改事件处理程序。

    更新2

    似乎,如果我们使用button click进行服务器端验证,我们还需要在Custom Validator中添加<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> 。请参阅CustomValidator not working well

    注意:客户端验证问题出现在此处:Whether to use Page_IsValid or Page_ClientValidate() (for Client Side Events)

    MARKUP

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

    代码背后

    {{1}}

    参考

    1. Should I always call Page.IsValid?
    2. ASP.NET Validation Controls – Important Points, Tips and Tricks
    3. CustomValidator not working well

2 个答案:

答案 0 :(得分:35)

验证发生在Page_Load之后,但在事件处理程序之前(请参阅http://msdn.microsoft.com/en-us/library/ms178472(v=VS.100).aspx)。

如果您的按钮未导致验证,则必须手动触发Page.Validate.

您可能不会在(1)您致电Page.IsValid或(2)控件之后询问Page.Validate,导致验证是回发的来源/包含在其中。

如果您需要在事件处理程序触发之前进行验证,则可以使用:

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

当然,这取决于您的体系结构,以及您是否能够假设在初始验证期间通过/失败的验证在同一页面生命周期的后续验证期间仍然通过/失败。

答案 1 :(得分:0)

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

 <asp:Button Text=" Submit " runat="server" ID="btnSubmit" OnClick="btnSubmit_Click" ValidationGroup="vgCustomerValidation" />