Effective C# Item39 : 使用.NET验证
2010-02-21 23:53
375 查看
软件开发过程中,安全始终是一个非常重要的话题,如何能保证恶意数据数据不会进入到数据库中,如何使得软件“水火不侵”,经常会成为折磨开发人员的噩梦。保证程序安全的一个重要手段就是对软件的入力数据进行检查,入力数据可能来自于用户直接的手动入力,也可能来自于外部的其他模块,我们需要在业务逻辑执行之前,对数据进行检查,保证只有“正确”的数据才能执行业务逻辑。
有时执行这种检查是很繁琐的,.NET为我们提供了一些验证机制。针对桌面应用程序和Web应用程序,.NET为我们提供了不同的方式来对数据进行验证。
针对桌面应用程序,针对需要进行验证的控件,我们需要为其注册Validating事件,在该事件中,编写数据检查的逻辑,同时还需要将控件的CauseValidation属性设置为true,否则,是不会触发Validating事件的。
我们来看下面的代码。
Aspx 控件验证
上述代码,针对四种类型的Validator,都列出了两种情况,第一种情况是验证不通过,第二种情况是验证通过。执行结果如下。
![](http://pic002.cnblogs.com/img/wing011203/201002/2010022123522540.jpg)
通过上面的介绍,我们应该对.NET中的验证机制有一个大致的了解了,当然,上述提供的代码只是出于说明示范作用,在真实的环境中,情况要更加复杂多变,我们还需要见招拆招,具体问题具体分析。
有时执行这种检查是很繁琐的,.NET为我们提供了一些验证机制。针对桌面应用程序和Web应用程序,.NET为我们提供了不同的方式来对数据进行验证。
针对桌面应用程序,针对需要进行验证的控件,我们需要为其注册Validating事件,在该事件中,编写数据检查的逻辑,同时还需要将控件的CauseValidation属性设置为true,否则,是不会触发Validating事件的。
我们来看下面的代码。
Aspx 控件验证
/// <summary> /// test aspx page validation. /// </summary> private static void AspxValidateTest() { Page pgTest = new Page(); System.Web.UI.WebControls.TextBox txtName = new System.Web.UI.WebControls.TextBox(); txtName.ID = "txtName"; pgTest.Controls.Add(txtName); //RequiredFieldValidator Console.WriteLine("RequiredValidator:"); System.Web.UI.WebControls.RequiredFieldValidator requiredValidator = new System.Web.UI.WebControls.RequiredFieldValidator(); requiredValidator.ID = "requiredValidator"; requiredValidator.ControlToValidate = txtName.ID; requiredValidator.ErrorMessage = "Required input!"; pgTest.Controls.Add(requiredValidator); txtName.Text = string.Empty; Validate(requiredValidator); txtName.Text = "aaa"; Validate(requiredValidator); Console.WriteLine(); //RangedValidator Console.WriteLine("RangeValidator"); System.Web.UI.WebControls.RangeValidator rangeValidator = new System.Web.UI.WebControls.RangeValidator(); rangeValidator.ID = "rangeValidator"; rangeValidator.ControlToValidate = txtName.ID; rangeValidator.MinimumValue = "a"; rangeValidator.MaximumValue = "z"; rangeValidator.Type = System.Web.UI.WebControls.ValidationDataType.String; rangeValidator.ErrorMessage = "Out of Range !"; pgTest.Controls.Add(rangeValidator); txtName.Text = "!@#"; Validate(rangeValidator); txtName.Text = "a"; Validate(rangeValidator); Console.WriteLine(); //CompareValidator Console.WriteLine("CompareValidator:"); System.Web.UI.WebControls.TextBox txtMin = new System.Web.UI.WebControls.TextBox(); txtMin.ID = "txtMin"; System.Web.UI.WebControls.TextBox txtMax = new System.Web.UI.WebControls.TextBox(); txtMax.ID = "txtMax"; pgTest.Controls.Add(txtMax); pgTest.Controls.Add(txtMin); System.Web.UI.WebControls.CompareValidator compareValidator = new System.Web.UI.WebControls.CompareValidator(); compareValidator.ID = "compareValidator"; compareValidator.ControlToValidate = txtMin.ID; compareValidator.ControlToCompare = txtMax.ID; compareValidator.Operator = System.Web.UI.WebControls.ValidationCompareOperator.LessThan; compareValidator.ErrorMessage = "Compare Fail !"; pgTest.Controls.Add(compareValidator); txtMin.Text = "b"; txtMax.Text = "a"; Validate(compareValidator); txtMax.Text = "c"; Validate(compareValidator); } /// <summary> /// validate with validator. /// </summary> /// <param name="validator"></param> private static void Validate(System.Web.UI.WebControls.BaseValidator validator) { if (validator == null) { return; } validator.Validate(); if (!validator.IsValid) { Console.WriteLine(validator.ErrorMessage); } else { Console.WriteLine("Your Input is Valid!"); } }
上述代码,针对四种类型的Validator,都列出了两种情况,第一种情况是验证不通过,第二种情况是验证通过。执行结果如下。
![](http://pic002.cnblogs.com/img/wing011203/201002/2010022123522540.jpg)
通过上面的介绍,我们应该对.NET中的验证机制有一个大致的了解了,当然,上述提供的代码只是出于说明示范作用,在真实的环境中,情况要更加复杂多变,我们还需要见招拆招,具体问题具体分析。
相关文章推荐
- Effective C# Item39 : 使用.NET验证
- Effective C# Item13:使用静态构造器初始化静态类成员
- Effective C# Item29:只有当新版基类导致问题时才考虑使用new修饰符
- Item 39:明智地使用private继承 Effective C++笔记
- More Effective C# Item6 : 使用委托定义类型参数上的方法约束
- Effective C++ Item 39 明智而审慎地使用 private 继承
- Effective C# Item13:使用静态构造器初始化静态类成员
- Effective C# Item6:明辨值类型和引用类型的使用场合
- Effective C# Item43 : 避免过度使用反射
- Effective C# 原则39:使用.Net验证(译)
- Effective C# Item29:只有当新版基类导致问题时才考虑使用new修饰符
- 读书笔记 effective c++ Item 39 明智而谨慎的使用private继承
- More Effective C# Item1 : 使用1.x框架API的泛型版本
- [翻译] Effective C++, 3rd Edition, Item 39: 谨慎使用 private inheritance(私有继承)(上)
- More Effective C# Item8 :尽可能使用泛型方法,除非需要将类型参数用于实例的字段中
- [翻译] Effective C++, 3rd Edition, Item 39: 谨慎使用 private inheritance(私有继承)(下)
- Effective C# Item2:运行时常量(readonly)优于编译时常量(const)
- Effective C# Item3:操作符as或is优于强制转换
- Item 2:避免使用define Effective C++笔记
- Item 39: Use private inheritance judiciously(Effective C++)