加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – Page.IsValid如何工作?

发布时间:2020-12-15 19:34:01 所属栏目:asp.Net 来源:网络整理
导读:我有一个RequiredFieldValidator的以下代码。 EnableClientScript属性在验证控件中设置为“false”。我也在浏览器中禁用脚本。 我不在后面的代码中使用Page.IsValid。不过,当我在文本框中提交没有任何值时,我会收到错误消息。 从@Dai的意见,我知道这可以
我有一个RequiredFieldValidator的以下代码。 EnableClientScript属性在验证控件中设置为“false”。我也在浏览器中禁用脚本。

我不在后面的代码中使用Page.IsValid。不过,当我在文本框中提交没有任何值时,我会收到错误消息。

从@Dai的意见,我知道这可以是一个问题,如果在Page_Load中有任何代码在回发中执行。将不会抛出验证错误。

(但是,对于按钮单击处理程序,没有必要检查Page.IsValid)

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

>为什么服务器端验证不会在Page_Load之前发生?
>为什么当我使用Page.IsValid时它工作正常?
>你能提供任何参考文章来解释这个吗? (不是说 – 总是使用Page.IsValid;但是说什么是强制性方案使用Page.IsValid

更新1

参见ASP.NET Validators Common Misconception

Page.IsValid is accessible only after running Page.Validate() method which is invoked implicitly somewhere after Page_Load. In case you keep all of your logic in a Page_Load event handler (which is highly discouraged!),call the Page.Validate() before checking the Page.IsValid.

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

更新2

看起来,我们需要添加If(Page.IsValid)在按钮点击也如果我们使用自定义验证器与服务器端验证。参见CustomValidator not working well。

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

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

参考文献:

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

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读