ASP.NET MVC3 读书笔记三(数据注解Dataannotation和验证)
2013-06-04 17:48
405 查看
验证在表单数据来说起到非常重要的作用,一般我们的处理是通过js来进行前端的验证,对于重要的数据还进行相应的后端数据验证;
如果觉得验证是令人望而生畏的繁琐的事情,那么值得高兴的是ASP.NET MVC框架可以帮助处理这些琐事;并且可以很好得支持前端JS验证和后端服务器验证;毕竟对于重要的表单数据来说前端JS还是只起到了进站口的检查,通过一些工具可以轻易的破掉js的验证;但对于服务器验证也并不是万无一失,只是完全强度会高很多;
MVC主要是通过Model的方式进行数据注解和验证,那么就需要实体类的支持;我们使用EF CodeFirst来进行实体与数据库的相应交互;
以下说明的表单提交方式为ajax提交;
View Code
定义一个类,继承自ValidationAttribute,然后重写IsValid方法,IsValid中的value就是我们需要判断的值,进行相应判断处理后,返回一个ValidationResult对象就可以;
写完以上,只能在服务器端进行验证,无法在ajax提交前进行验证;
首先,在上面的类中,必须继承【IClientValidatable】接口并且实现接口的
其中_result为自定义的一个属性,可以在前台js里面取到定义在rule.ValidationParameters中的键值对
Yield为返回一个IEnumerable的迭代;
此时只是在后台中写好相应的数据返回到js中,js中的验证还是需要我们自己写,才能进行js验证;
Js写法如下:
Firstupper为后台代码中定义的rule.ValidationType;res为后台定义的键值对;第一行是将validationtype加载到validator适配器中,然后在addMethod对应即可;
其中firstupper依然为validationtype,回调方法中的第一个value是当前输入的值,element为整个元素对象,firstupper为res对应的键值对的值;进行判断后,页面js会自动打上“EployName第一个字母必须大写”,如果在model实体上写了ErorMessage也会自动的打出自定义的错误信息;自定义验证都必须遵循相应的规范,并且自行判断实现;(js端必须引用验证js);
以上这种写法是比较同用的自定义注解验证;
下面可以直接在实体上面进行注解验证;
在对应的实体里面实现IValidatableObject,即可直接操作实例的字段进行验证;[好像只能在服务器端验证,在js客户端的验证好像不好实现];
具体选用哪种验证要看具体的业务需求在进行选择;
8、 其它注解
在实体中除了注解一些验证信息外还可以注解其它的信息,比如
在通过labelfor的时候就会显示”用户名”,而不显示EmployName;
在进行EditorForModel进行全字段映射的时候,不会映射EmployName字段
在输入9.0的时候会自动格式化为$9.00
如果写法【[DisplayFormat(ApplyFormatInEditMode=true,DataFormatString="{0:c}")]】
则会将$9.00进行回填,所以此处应该设置为flase不回填格式化的值,回填输入的值;
设置为readonly后,页面在提交后台时,模型不会绑定新增;页面中设置为disable的input都不会重新绑定模型提交后台;
生成为hidden的input控件
如果觉得验证是令人望而生畏的繁琐的事情,那么值得高兴的是ASP.NET MVC框架可以帮助处理这些琐事;并且可以很好得支持前端JS验证和后端服务器验证;毕竟对于重要的表单数据来说前端JS还是只起到了进站口的检查,通过一些工具可以轻易的破掉js的验证;但对于服务器验证也并不是万无一失,只是完全强度会高很多;
MVC主要是通过Model的方式进行数据注解和验证,那么就需要实体类的支持;我们使用EF CodeFirst来进行实体与数据库的相应交互;
以下说明的表单提交方式为ajax提交;
View Code
public class FirstUpper:ValidationAttribute { public FirstUpper() :base("{0} 第一个字母必须大写") { } protected override ValidationResult IsValid(object value,ValidationContext validationContext) { if (value != null) { var indexStr=value.ToString().Substring(0,1); if (!indexStr.Equals(indexStr.ToUpper())) { var errorMessage = FormatErrorMessage(validationContext.DisplayName); return new ValidationResult(errorMessage); } } return ValidationResult.Success; } }
[FirstUpper] public string EmployName { get; set; }
定义一个类,继承自ValidationAttribute,然后重写IsValid方法,IsValid中的value就是我们需要判断的值,进行相应判断处理后,返回一个ValidationResult对象就可以;
写完以上,只能在服务器端进行验证,无法在ajax提交前进行验证;
首先,在上面的类中,必须继承【IClientValidatable】接口并且实现接口的
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { var rule = new ModelClientValidationRule(); rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()); rule.ValidationParameters.Add("res", _result); rule.ValidationType = "firstupper"; yield return rule; }
其中_result为自定义的一个属性,可以在前台js里面取到定义在rule.ValidationParameters中的键值对
Yield为返回一个IEnumerable的迭代;
此时只是在后台中写好相应的数据返回到js中,js中的验证还是需要我们自己写,才能进行js验证;
Js写法如下:
//实现IClientValidatable接口的客户端验证 if ($.validator && $.validator.unobtrusive) { $.validator.unobtrusive.adapters.addSingleVal("firstupper","res"); //适配器 适配器名称要与服务器上的ValidationType对应 $.validator.addMethod("firstupper", function (value, element, firstupper) { var indexStr = value.substr(0, 1); if (indexStr != indexStr.toLocaleUpperCase()) { return false; } return true; }); }
Firstupper为后台代码中定义的rule.ValidationType;res为后台定义的键值对;第一行是将validationtype加载到validator适配器中,然后在addMethod对应即可;
其中firstupper依然为validationtype,回调方法中的第一个value是当前输入的值,element为整个元素对象,firstupper为res对应的键值对的值;进行判断后,页面js会自动打上“EployName第一个字母必须大写”,如果在model实体上写了ErorMessage也会自动的打出自定义的错误信息;自定义验证都必须遵循相应的规范,并且自行判断实现;(js端必须引用验证js);
以上这种写法是比较同用的自定义注解验证;
下面可以直接在实体上面进行注解验证;
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { var indexStr = EmployName.ToString().Substring(0, 1); if (!indexStr.Equals(indexStr.ToUpper())) { yield return new ValidationResult("EmployName 第一个字符必须大写", new[] { "EmployName" }); } }
在对应的实体里面实现IValidatableObject,即可直接操作实例的字段进行验证;[好像只能在服务器端验证,在js客户端的验证好像不好实现];
具体选用哪种验证要看具体的业务需求在进行选择;
8、 其它注解
在实体中除了注解一些验证信息外还可以注解其它的信息,比如
[Display(Name="用户名")] public string EmployName { get; set; }
在通过labelfor的时候就会显示”用户名”,而不显示EmployName;
[ScaffoldColumn(false)] public string EmployName { get; set; }
在进行EditorForModel进行全字段映射的时候,不会映射EmployName字段
[DisplayFormat(DataFormatString="{0:c}")] public decimal price { get; set; }
在输入9.0的时候会自动格式化为$9.00
如果写法【[DisplayFormat(ApplyFormatInEditMode=true,DataFormatString="{0:c}")]】
则会将$9.00进行回填,所以此处应该设置为flase不回填格式化的值,回填输入的值;
[ReadOnly(true)] public string EmployName { get; set; }
设置为readonly后,页面在提交后台时,模型不会绑定新增;页面中设置为disable的input都不会重新绑定模型提交后台;
[HiddenInput] public string EmployName { get; set; }
生成为hidden的input控件
相关文章推荐
- ASP.NET MVC3 读书笔记四(数据注解和验证)
- ASP.NET MVC3 读书笔记四(数据注解和验证)
- ASP.NET MVC3书店--第六节 使用注解来进行数据验证(转)
- asp.net mvc3 数据验证(三)—自定义数据注解
- asp.net mvc3 数据验证(三)—自定义数据注解
- ASP.NET MVC3书店--第六节 使用注解来进行数据验证
- asp.net mvc3 数据验证(三)—自定义数据注解
- asp.net mvc3 数据验证(三)—自定义数据注解
- asp.net mvc3 数据验证(三)—自定义数据注解
- Hibernate Validation,Spring mvc 数据验证框架注解
- spring数据验证----自定义注解
- 浅谈在asp.net mvc3中使用IValidatableObject接口实现Model数据验证
- MVC学习手册之数据注解与验证
- ASP.NET MVC3 入门指南之数据验证[源码RAR下载]
- MVC-Model数据注解(三)-Remote验证的一个注意事项
- Spring 自己实现注解数据验证
- 利用java注解验证bean对象数据格式
- MVC4数据注解和验证
- ASP.NET MVC5----常见的数据注解和验证
- 浅谈在asp.net mvc3中使用IValidatableObject接口实现Model数据验证