【问题标题】:Should I always call Page.IsValid?我应该总是调用 Page.IsValid 吗?
【发布时间】:2010-11-05 14:01:19
【问题描述】:

我知道永远不要相信用户输入,因为不需要的输入可能会以某种方式损害应用程序的完整性,无论是意外的还是有意的;但是,是否存在调用 Page.IsValid 的情况,即使页面上没有验证控件(同样,我知道通过忽略验证来信任用户输入是不好的做法)? Page.IsValid 是否执行任何其他类型的验证?我查看了 MSDN,文档似乎表明 Page.IsValid 仅在页面上有验证控件或已调用 Page.Validate 方法时才有效。我的一个朋友建议我每次都在按钮单击处理程序中检查 Page.IsValid,即使没有验证控件或显式 Page.Validate 调用。

【问题讨论】:

    标签: c# asp.net .net validation


    【解决方案1】:

    您可能仍想调用它,因为将来它们可能会验证控件。我知道这有点属于根据未来需求添加功能,但它也可以保护自己免于需要知道页面是否有效并且不需要通过所有事件处理程序等来确保如果验证器确实获得它就在那里添加。我们有一个规则,我们总是添加它,所以我们以后不会出现不验证的问题。

    【讨论】:

      【解决方案2】:

      我会第一个告诉你“所有输入都是邪恶的,除非被证明不是这样。”但是,在这种情况下,我认为你的朋友是错误的,因为按照他/她的逻辑我们可能会想出应该检查或设置的一百个其他属性,即使默认值没问题。

      检查Page.IsValid 仅在您有“CausesValidation”场景时才有意义——提交表单的按钮将其CausesValidation 属性设置为True。这将自动调用Page.Validate,并且将检查属于同一ValidationGroup 的所有验证控件的有效性。

      编辑:

      刚刚使用 Reflector 进行了检查,如果页面没有任何验证器(ValidatorCollection 为空),该函数将始终返回 True。

      【讨论】:

      • 另外,前几天我刚刚遇到了一个场景,我得到了一个 YPOD(死亡黄页),因为我删除了一个验证器控件,进行了回发调用,并且在后面的代码没有找到任何触发其验证事件的验证器。
      • 谢谢,我只是想确保我没有失去理智。哈哈。
      • 刚刚编辑了我的帖子以包含一些额外的信息。感谢您的投票/接受。 :-)
      【解决方案3】:

      您可以通过检查 Page.IsValid 属性来检查页面的有效性,您检查 Page.IsValid 的目的可能会有所不同

      • 如果您的验证器的 EnableClientScript 属性设置为 false
      • 如果您有一个服务器端验证验证器
      • 在 PostBack 事件处理程序主体中执行关键操作之前,例如 SaveDeleteAuthenticate...
      • 根据页面的有效性执行/显示不同的事情...
      • 你能想到的任何事情......

      那么你什么时候/在哪里可以调用 Page.IsValid

      1. 如果页面在回发
      2. 如果 回发 是由 CausesValidation 属性设置为 true 的输入控件引起的。
      3. 在调用 Page.Validate 之后,即 在 Page.Load 事件之后

      如果调用的地点/时间满足以上条件,可以在页面生命周期中检查Page.IsValid;否则 Page.IsValid 将导致 System.Web.HttpException 被抛出。

      您应该在有意义的地方使用 Page.IsValid ;就像在输入控件的回发事件处理程序中一样(使用 CausesValidation=true),并要求页面状态有效才能正确执行其任务。 (如果您有服务器端验证的验证器或关闭了客户端验证的验证器,则它成为必须)。

         protected void btnSave_Click(object sender, EventArgs e)
          {
             //Note that there might be ServerSideValidation which evaluated to false.
             if (!Page.IsValid)  
               return;
      
             CurrentEntity.Save();
          }
      

      最后请注意,Page.IsValid 仅检查您页面上的验证器控件中的验证错误,这完全取决于您的验证器控件的作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-10
        • 2011-01-24
        • 1970-01-01
        • 2012-03-20
        • 2011-03-31
        • 2023-04-02
        • 2019-07-20
        相关资源
        最近更新 更多