ASP.NET MVC下的四种验证编程方式
2016-05-09 09:24
691 查看
1: public class Person [code] 2:{
public string Name{ get; set;}
[DisplayName("性别")]
public int? Age{ get; set;}
{
public ActionResult Index()
return View(new Person());
public ActionResult Index(Person person)
Validate(person);
if (!ModelState.IsValid)
return View(person);
else
return Content("输入数据通过验证");
}
private void Validate(Person person)
if (string.IsNullOrEmpty(person.Name))
ModelState.AddModelError("Name", "'Name'是必需字段");
{
}
string.Compare(person.Gender, g, true) == 0))
36:{
}
if (null == person.Age)
ModelState.AddModelError("Age", "'Age'是必需字段");
else if (person.Age > 25 || person.Age < 18)
ModelState.AddModelError("Age", "有效'Age'必须在18到25周岁之间");
}
[/code]
2: <html>
head>
4: <title>编辑人员信息</title>
head>
6: <body>
@using (Html.BeginForm())
<div>@Html.LabelFor(m=>m.Name)</div>
div>@Html.EditorFor(m=>m.Name)</div>
12:
div>@Html.LabelFor(m=>m.Gender)</div>
14: <div>@Html.EditorFor(m => m.Gender)</div>
<div>@Html.LabelFor(m=>m.Age)</div>
div>@Html.EditorFor(m => m.Age)</div>
18:
input type="submit" value="保存"/>
20:}
body>
22: </html>
[/code]
1: [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
[code] 2: public class DomainAttribute : ValidationAttribute
public IEnumerable<string> Values{ get; private set;}
public DomainAttribute(string value)
this.Values = new string[]{ value};
{
}
public override bool IsValid(object value)
if (null == value)
return true;
return this.Values.Any(item => value.ToString() == item);
{
string.Format("'{0}'",value)).ToArray();
28: return string.Format(base.ErrorMessageString, name,string.Join(",", values));
}
[/code]
[/code]
由于ASP.NET MVC在进行参数绑定的时候会自动提取应用在目标参数类型或者数据成员上的ValidationAttribute特性,并利用它们对提供的数据实施验证,所以我们不再需要像上面演示的实例一样自行在Action方法中实施验证,而只需要在定义参数类型Person的时候应用相应的ValidationAttribute特性将采用的验证规则与对应的数据成员相关联。如下所示的是属性成员上应用了相关ValidationAttribute特性的Person类型的定义。我们在三个属性上均应用了RequiredAttribute特性将它们定义成必需的数据成员,Gender和Age属性上则分别应用了DomainAttribute和RangeAttribute特性对有效属性值的范围作了相应限制。
[code] 1: public class Person
[code] 2:{
[Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(Resources))]
[Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(Resources))]
public string Gender{ get; set;}
[DisplayName("年龄")]
[Range(18, 25, ErrorMessageResourceName = "Range", ErrorMessageResourceType = typeof(Resources))]
}
[/code]
[/code]
1: public class HomeController : Controller
[code] 2:{
[HttpPost]
{
{
}
{
}
}
[/code]
[/code]
三、让数据类型实现IValidatableObject接口
除了将验证规则通过ValidationAttribute特性直接定义在数据类型上并让ASP.NET MVC在进行参数绑定过程中据此来验证参数之外,我们还可以将验证操作直接定义在数据类型中。既然我们将验证操作直接实现在了数据类型上,意味着对应的数据对象具有“自我验证”的能力,我们姑且将这些数据类型称为“自我验证类型”。这些自我验证类型是实现了具有如下定义的接口IValidatableObject,该接口定义在“System.ComponentModel.DataAnnotations”命名空间下。
[code] 1: public interface IValidatableObject
[code] 2:{
}
[/code]
[/code]
如上面的代码片断所示,IValidatableObject接口具有唯一的方法Validate,针对自身的验证就实现在该方法中。对于上面演示实例中定义的数据类型Person,我们可以按照如下的形式将它定义成自我验证类型。
[code] 1: public class Person: IValidatableObject
[code] 2:{
public string Name{ get; set;}
[DisplayName("性别")]
public int? Age{ get; set;}
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
Person person = validationContext.ObjectInstance as Person;
{
}
{
}
if (string.IsNullOrEmpty(person.Gender))
yield return new ValidationResult("'Gender'是必需字段", new string[]{ "Gender"});
else if (!new string[]{"M","F"}.Any(g=>string.Compare(person.Gender,g, true) == 0))
yield return new ValidationResult("有效'Gender'必须是'M','F'之一", new string[]{ "Gender"});
{
}
{
}
}
[/code]
[/code]
如上面的代码片断所示,我们让Person类型实现了IValidatableObject接口。在实现的Validate方法中,我们从验证上下文中获取被验证的Person对象,并对其属性成员进行逐个验证。如果数据成员没有通过验证,我们通过一个ValidationResult对象封装错误消息和数据成员名称(属性名),该方法最终返回的是一个元素类型为ValidationResult的集合。在不对其他代码作任何改动的情况下,我们直接运行该程序并在输入不合法数据的情况下提交表单后依然会得到如图1所示的输出结果。
四、让数据类型实现IDataErrorInfo接口
上面我们让数据类型实现IValidatableObject接口并将具体的验证逻辑定义在实现的Validate方法中,这样的类型能够被ASP.NET MVC所识别,后者会自动调用该方法对绑定的数据对象实施验证。如果我们让数据类型实现IDataErrorInfo接口也能实现类似的自动化验证效果。IDataErrorInfo接口定义在“System.ComponentModel”命名空间下,它提供了一种标准的错误信息定制方式。如下面的代码片段所示,IDataErrorInfo具有两个成员,只读属性Error用于获取基于自身的错误消息,而只读索引用于返回指定数据成员的错误消息。
[code] 1: public interface IDataErrorInfo
[code] 2:{
string this[string columnName]{ get;}
{
public string Name{ get; set;}
[DisplayName("性别")]
public int? Age{ get; set;}
[ScaffoldColumn(false)]
private set;}
14:
{
{
{
{
{
}
}
{
{
}
string.Compare(this.Gender, g, true) == 0))
36:{
}
}
{
{
}
this.Age < 18)
48:{
}
}
}
}
[/code]
[/code]
ASP.NET MVC下的四种验证编程方式[续篇]
相关文章推荐
- [置顶] Java报表小记之 JasperReports & iReport
- 微信开发(一) asp.net接入
- ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)
- 在ASP.NET 2.0中操作数据之二十七:创建自定义排序用户界面
- ASP.NET MVC3中Controller与View之间的数据传递总结
- 在ASP.NET 2.0中操作数据之二十七:创建自定义排序用户界面
- 微信开发(一) asp.net接入
- asp.net log4net的使用方法
- 在ASP.NET 2.0中操作数据之二十八:GridView里的Button
- ASP.NET邮件发送system.Net.Mail案例
- asp.net mvc发送邮件实例讲解
- 在ASP.NET 2.0中操作数据之二十九:用DataList和Repeater来显示数据
- 在ASP.NET 2.0中操作数据之三十:格式化DataList和Repeater的数据
- 在ASP.NET 2.0中操作数据之三十一:使用DataList来一行显示多条记录
- 在ASP.NET 2.0中操作数据之三十二:数据控件的嵌套
- 在ASP.NET 2.0中操作数据之三十三:基于DataList和Repeater使用DropDownList过滤的主/从报表
- 在ASP.NET 2.0中操作数据之三十四:基于DataList和Repeater跨页面的主/从报表
- 菜刀ASP 下载文件抓包
- ASP.NET总结
- 对比aspx和html