【问题标题】:How does Page.IsValid work?Page.IsValid 是如何工作的?
【发布时间】:2012-11-25 14:16:30
【问题描述】:

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

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

从@Dai 的 cmets,我知道这可能是一个问题,如果 Page_Load 中有任何代码在 postback 中执行。不会引发验证错误。

(但是,对于按钮点击处理程序,无需检查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 Validators Common Misconception

Page.IsValid 只有在运行Page.Validate() 方法后才能访问,该方法在Page_Load 之后的某处被隐式调用。如果您将所有逻辑保存在 Page_Load 事件处理程序中(强烈建议不要这样做!),请在检查 Page.IsValid 之前调用 Page.Validate()

注意:建议不要保留Page_Load 中的所有逻辑。如果按钮单击事件发生某些事情,请将其移至按钮单击事件处理程序。如果在下拉事件中发生某些事情,请将其移动到下拉选定项更改事件处理程序。

更新 2

看起来,如果我们使用带有服务器端验证的Custom Validator,我们也需要在button click 中添加If(Page.IsValid)。参考CustomValidator not working well

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

标记

<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. Should I always call Page.IsValid?
  2. ASP.NET Validation Controls – Important Points, Tips and Tricks
  3. CustomValidator not working well

【问题讨论】:

  • @MassimilianoPeluso 这个问题很相似,但没有解决相同的问题。它说“即使页面上没有验证控件也调用 Page.IsValid ”。但我的页面中有验证控件
  • 您需要向我们展示您的代码隐藏逻辑。根据您编写代码的方式,可能需要也可能不需要检查IsValid。例如,如果您的逻辑位于仅在页面有效时调用的按钮单击处理程序中,则 IsValid 检查在幕后完成,但如果您的逻辑位于由 if( IsPostback ); Validate(); if( IsValid ) 保护的 Page_Load 中那么您确实需要检查该属性。
  • 您能否评论一下我需要澄清什么才能完全回答您的问题?我认为提供的答案涵盖了您的问题,但也许需要澄清一下?
  • 没有什么时候使用Page.IsValid 的强制场景——你的逻辑表明了这一点,正如我在回答中所逃避的那样。唯一强制的操作顺序是在询问Page.IsValid 之前必须调用Page.Validate(由您或在回发期间由控件指示)。如果您的逻辑要求页面有效才能继续,您只需检查Page.IsValid。话虽这么说,你永远不应该依赖一个不触发的事件,如果它是无效的,并且永远不要假设“如果我到达这里,页面必须是有效的。”

标签: asp.net validation


【解决方案1】:

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

如果你的按钮没有引起验证,你必须手动触发Page.Validate.

在 (1) 您已调用 Page.Validate 或 (2) 导致验证的控件是回发的来源/包含在回发中之前,您不得询问 Page.IsValid

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

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

【讨论】:

  • 当你说“如果你的按钮没有引起验证”时,你的意思是 CausesValidation="false" 吗?
  • 是的,但有一个警告。如果CausesValidationfalseUseSubmitBehaviortrue,我相当肯定仍然会发生一些验证。我现在找不到任何好的参考,但我相信我遇到了这样的情况。也许 SO 上的某个人可以评论这是否真的如此。
  • 如果您只想在有效页面上执行操作,则只需勾选Page.IsValid。在一些非常真实的用例中,您可能希望在一次点击时 100% 地执行某项操作,如果所有验证器都通过了其他操作。我会稍微扩展一下我的答案。
  • 如果客户端用户关闭了 javascript,page.isvalid 是否也可以在服务器上工作?
  • 是的,服务器端的有效性检查不管javascript如何。 javascript 部分只是减少了不必要的回发。重要的是要记住,您几乎不应该相信来自客户端的任何东西,因为用户很容易篡改它。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-03-31
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2016-11-13
    相关资源
    最近更新 更多