我应该一直打电话给Page.IsValid吗?

时间:2009-06-24 16:31:53

标签: c# asp.net .net validation

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

3 个答案:

答案 0 :(得分:20)

我会第一个告诉你“所有输入都是邪恶的,直到证明不然。”然而,在这种情况下,我认为你的朋友错了,因为根据他/她的逻辑我们可能提出应该检查或设置的其他一百个属性,即使默认值是可以的。

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

修改

只需使用Reflector检查它,如果Page没有任何Validator(ValidatorCollection为null),函数将始终返回True。

答案 1 :(得分:6)

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

  • 如果您有将 EnableClientScript 属性设置为false的验证程序
  • 如果您有服务器端验证的验证器
  • 在PostBack事件处理程序正文中执行关键操作之前,例如保存删除验证 ......
  • 根据页面的有效性进行/显示不同的内容......
  • 你能想到的任何事情......

所以你何时/何地可以调用Page.IsValid

  1. 如果页面位于回发
  2. 如果回发是由 CausesValidation 属性设置为 true 的输入控件引起的。
  3. 在调用 Page.Validate 之后,即在Page.Load事件之后
  4. 如果调用的地点/时间满足上述条件,您可以在页面生命周期中检查Page.IsValid;否则Page.IsValid将导致抛出 System.Web.HttpException

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

       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 :(得分:2)

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