首页 新闻 赞助 找找看

请教MVC中DBfirst或ModelFirst情况下如何使用特性验证?

0
悬赏园豆:30 [已解决问题] 解决于 2014-01-12 17:40

如题,这两种模式下类是自动生成的,我又想用特性验证,怎么办呢?

happydaily的主页 happydaily | 菜鸟二级 | 园豆:301
提问于:2014-01-04 11:04
< >
分享
最佳答案
1

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。

收获园豆:15
鹤冲天 | 老鸟四级 |园豆:2379 | 2014-01-04 23:04
其他回答(2)
0

在UI中建ViewModel.对Viewmodel做特性验证

收获园豆:10
吴瑞祥 | 园豆:29449 (高人七级) | 2014-01-04 11:21
0

在UI中建ViewModel.对Viewmodel做特性验证  1楼说的可以,与这两种模式下自动生成的类没什么关系。

收获园豆:5
aehyok | 园豆:1212 (小虾三级) | 2014-01-04 11:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册