Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net Page.IsValid如何工作?_Asp.net_Validation - Fatal编程技术网

Asp.net Page.IsValid如何工作?

Asp.net Page.IsValid如何工作?,asp.net,validation,Asp.net,Validation,我有以下带有RequiredFieldValidator的代码。验证控件中的EnableClientScript属性设置为“false”。我还禁用了浏览器中的脚本 我没有使用Page.IsValid中的代码隐藏。不过,当我在文本框中没有任何值的情况下提交时,我会收到错误消息 从@Dai的评论中,我了解到,如果页面加载中有任何代码在回发中执行,这可能是一个问题。不会抛出任何验证错误 (但是,对于按钮单击处理程序,不需要检查页面。是否有效) 问题 为什么服务器端验证不在加载页面之前进行 为什么我使用

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

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

从@Dai的评论中,我了解到,如果
页面加载
中有任何代码在
回发
中执行,这可能是一个问题。不会抛出任何验证错误

(但是,对于按钮单击处理程序,不需要检查
页面。是否有效

问题

  • 为什么服务器端验证不在加载页面之前进行
  • 为什么我使用
    Page.IsValid
    时它工作正常
  • 你能提供一篇文章来解释这一点吗?(不是说-始终使用
    Page.IsValid
    ;而是说必须使用
    Page.IsValid
  • 更新1

    提及

    Page.IsValid
    只有在运行
    Page.Validate()
    方法后才可访问,该方法在
    Page\u Load
    之后的某处隐式调用。如果将所有逻辑保留在Page\u Load事件处理程序中(这是非常不推荐的!),请调用
    Page.Validate()
    在检查
    页面之前。是否有效

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

    更新2

    似乎,如果(Page.IsValid)在
    按钮中单击
    也需要添加
    If(Page.IsValid)
    如果我们使用的是带有服务器端验证的
    自定义验证器
    。请参阅

    注意:此处存在客户端验证问题:

    标记

    <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>
    
    参考资料


  • 验证发生在
    页面加载之后,但在事件处理程序之前(请参阅)

    如果您的按钮未导致验证,则必须手动启动
    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();
       }
    }
    
    如果您使用的是 CualValualUs>/Cuff>,它有一个非常昂贵的验证步骤,您可以考虑将结果缓存在HythPrimys.Cache < /Cord>中,因此如果多次调用PAGE,则不必重新验证。
    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%取决于您的体系结构,以及您是否能够假设初始验证期间通过/失败的验证在同一页面生命周期的后续验证期间仍然通过/失败。

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

     <asp:Button Text=" Submit " runat="server" ID="btnSubmit" OnClick="btnSubmit_Click" ValidationGroup="vgCustomerValidation" />
    
    
    
    @MassimilianoPeluso这个问题很相似,但不是针对同一个问题。它说“调用Page.IsValid,即使页面上没有验证控件”。但是我的页面中有验证控件。您需要向我们显示您的代码隐藏逻辑。根据您编写代码的方式,可能需要检查
    IsValid
    。例如,如果您的逻辑位于一个按钮单击处理程序中,该处理程序仅在页面有效时才会调用,则
    IsValid
    检查将在后台完成s、 但是如果您的逻辑在
    Page_Load
    中,由
    if(IsPostback);Validate();if(IsValid)
    保护,那么您确实需要检查属性。您能否评论一下我需要澄清什么才能完全回答您的问题?我认为提供的答案涵盖了您的问题,但可能有什么需要澄清?对于何时使用
    Page.IsValid
    ——您的逻辑规定了这一点,正如我在回答中回避的那样。唯一的强制操作顺序是必须调用
    Page.Validate
    (由您或在回发过程中由控件指定)在询问
    Page.IsValid
    之前。如果您的逻辑要求页面有效才能继续,则只需检查
    Page.IsValid
    。也就是说,如果事件无效,则决不能依赖未触发的事件,也决不能假设“如果我到达这里,页面必须有效。”当您说“如果您的按钮未导致验证”时,您的意思是CausesValidation=“false”吗"?是的,但是有一个警告。如果
    原因验证
    错误的
    但是
    使用提交行为
    正确的
    ,我相当肯定仍然会发生一些验证。我现在找不到任何关于它的好参考,但我相信我遇到了这样的情况。也许有人可以评论一下确实如此。如果您只想在有效页面上执行操作,您只需检查
    页面。IsValid
    。在一些非常实际的用例中,您可能希望在100%的时间内单击一次,如果所有验证程序都通过了,则需要执行其他操作。我将对我的答案进行一点扩展,以供参考。如果客户端用户有Java如果禁用了脚本,将
    页面。是否有效
    也会在服务器上工作?是的,服务器端有效性检查会在不考虑javascript的情况下完成。javascript
    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;
    }
    
     <asp:Button Text=" Submit " runat="server" ID="btnSubmit" OnClick="btnSubmit_Click" ValidationGroup="vgCustomerValidation" />