MVC 在 Model 验证方面使用 Provider 模式。验证,我们经常使用的是 DataAnnotationsModelValidatorProvider,它根据定义在 Model 上的 RequiredAttribute、StringLengthAttribute 生成相应的 ModelValidator,ModelValidator 完成验证工作。这种方式使用 Attribute 定义验证规则,使用比较方便、快捷。但在一些情况下,不太方便,比如楼主说所的Model自动生成的情况:一旦Model再次生成,标记在上面的的 Attribute 就丢失了。
我们可自己写一个 ModelValidatorProvider 来解决这个问题,参考代码:
using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Web.Mvc; public class CustomModelValidatorProvider : ModelValidatorProvider { public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context) { if (metadata.ContainerType == typeof(LoginModel)) { if (metadata.PropertyName == "UserName") { yield return new RequiredAttributeAdapter(metadata, context, new RequiredAttribute()); yield return new RegularExpressionAttributeAdapter(metadata, context, new RegularExpressionAttribute(@"\w{4,6}")); } else if (metadata.PropertyName == "Password") { yield return new StringLengthAttributeAdapter(metadata, context, new StringLengthAttribute(20) { MinimumLength = 6 }); } } else if (metadata.ContainerType == typeof(MyClass)) { //... } } }
这段代码不复杂,它为 LoginModel 类的两个属性,提供了三条简单的验证规则。
若使 CustomModelValidatorProvider 生效,需要在 Global.asax 文件的 Application_Start 方法最后中加入下面这行代码:
ModelValidatorProviders.Providers.Add(new CustomModelValidatorProvider());
CustomModelValidatorProvider 使用硬编码的方式提供验证规则,不灵活。通常,我在项目中都将验证规则写在数据库或Xml 文件中。当然,也就需要编写相应的 DbModelValidatorProvider 或 XmlModelValidatorProvider。
在UI中建ViewModel.对Viewmodel做特性验证
在UI中建ViewModel.对Viewmodel做特性验证 1楼说的可以,与这两种模式下自动生成的类没什么关系。