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

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

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

检查Page.IsValid只有在具有“CausesValidation”方案时才有意义 – 提交表单的按钮将其CausesValidation属性设置为True。 这将自动调用Page.Validate并且将检查属于同一ValidationGroup所有Validation控件的有效性。

编辑:

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

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

  • 如果您有将EnableClientScript属性设置为false的Validators
  • 如果您有服务器端validation的Validator
  • 在PostBack事件处理程序主体中执行关键操作之前,如保存删除validation
  • 根据页面的有效性做/显示不同的东西……
  • 你能想到的任何事情……

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

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

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

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

  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仅检查页面上validation器控件中的validation错误,这完全取决于validation器控件的作用。

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