我应该总是调用Page.IsValid吗?

20

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

3个回答

20

我要告诉你的第一件事是 "除非经过证明,否则所有输入都是有问题的。" 但是,在这种情况下,我认为你的朋友是错的,因为按照他/她的逻辑,我们可能会找出其他一百个应该检查或设置的属性,即使默认值也可以。

只有在存在"CausesValidation"场景时,检查Page.IsValid才有意义——提交表单的按钮具有其CausesValidation属性设置为True。 这将自动调用Page.Validate,并且同一ValidationGroup中的所有验证控件都将被检查是否有效。

编辑:

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


此外,前几天我遇到了一个情况,因为我删除了一个验证控件,进行了一次回发调用,但由于代码后台没有找到任何触发其验证事件的验证器,所以出现了YPOD(黄色死亡页面)错误。 - Dillie-O
谢谢,我只是想确保我没有失去理智。哈哈。 - mkelley33
刚刚编辑了我的帖子,加入了一些额外的信息。感谢您的投票/接受。 :-) - Cerebrus

7
您可以通过检查Page.IsValid属性来检查页面的有效性,您需要检查Page.IsValid的目的可能会有所不同,比如:
  • 如果您有设置EnableClientScript属性为false的验证器
  • 如果您有一个经过服务器端验证的验证器。
  • 在PostBack事件处理程序体中执行关键操作之前,例如保存、删除、身份验证...
  • 根据页面的有效性进行不同的操作/展示...
  • 任何您能想到的...
那么什么时候/在哪里可以调用Page.IsValid呢?
  1. 如果页面是在PostBack中
  2. 如果PostBack由将CausesValidation属性设置为true的输入控件引起。
  3. 在调用Page.Validate之后,即在Page.Load事件之后。
如果调用满足上述标准,您可以在页面生命周期中检查Page.IsValid;否则,调用Page.IsValid将导致System.Web.HttpException被抛出。
应该在Page.IsValid “有意义” 的地方使用它,例如在输入控件的PostBack事件处理程序中(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仅检查页面上验证控件中的验证错误,这完全取决于您的验证控件所做的操作。


2

您可能仍然希望调用它,因为未来可能会有验证控件。我知道这有点类似于根据未来需求添加功能,但也可以保护自己免受需要知道页面是否有效并通过所有事件处理程序等来确保它是否存在的影响,如果添加了验证器,则会出现这种情况。我们有一个规则,即始终添加它,以便我们不会在未来出现无法验证的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接