zoukankan      html  css  js  c++  java
  • ASP.NET MVC 2 验证消息本地化策略扩展

    ASP.NET MVC2 结合System.ComponentModel.DataAnnotations 提供了一套非常有效的实体验证框架。对于错误信息的处理,它默认提供了两种选择:

    1. 字符串常量
    2. 从程序集资源文件读取

    但是在我们这里,我们有一套自己的资源文件方案,也就是我们需要自己控件错误信息的本地化操作。由于在元数据,我们只能提供常量,无法进行字符串操作。一种比较直接和麻烦的办法就是重写所有的验证规则,在验证规则中对字符串常量进行本地化操作。

    [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
    public class CustomValidationAttribute : System.ComponentModel.DataAnnotations.ValidationAttribute
    {
        public CustomValidationAttribute(string message)
            : base(() => message.Localize())
        {
        }
    }
    

    但是这样做,一方面会比较麻烦,所有的验证规则我们都要进行重写;另一方面我们在设计model时就是特别的小心使用我们自己重写过的规则才能达到我们的目的,这将大大降低开发体验。为此,今天特别再次对照MVC2的源码,希望能找到一个可用的扩展点来解决这个问题。最终发现我们可以通过重写DataAnnotationsModelValidatorProvider的GetValidators方法来达到我们希望的效果:

    public class CustomDataAnnotationsModelValidatorProvider : System.Web.Mvc.DataAnnotationsModelValidatorProvider
    {
        protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
        {
            foreach (ValidationAttribute attribute in attributes.OfType<ValidationAttribute>())
            {
                if (!string.IsNullOrWhiteSpace(attribute.ErrorMessage))
                {
                    attribute.ErrorMessage = attribute.ErrorMessage.Localize();
                }
    
            }
    
            var validators = base.GetValidators(metadata, context, attributes);
    
            return validators;
        }
    }
    

    代码非常简单,我们只是在调用GetValidators方法之前,对attribute的错误消息进行一次本地化操作处理即可。通过这一次处理,我们可以同步处理客户端验证消息和服务器端验证消息的本地化。下面的工作就是用这个Provider来代替它的父类,在Global.asax添加下面的代码即可完成:

    ModelValidatorProviders.Providers.RemoveAt(0);
    ModelValidatorProviders.Providers.Insert(0, new CustomDataAnnotationsModelValidatorProvider());
    

    通过这样一个小小的扩展,就可以很完美的达到我们的目的。不过,为了这个小扩展,却花费了我们不少的时间。

    阿不 http://hjf1223.cnblogs.com
  • 相关阅读:
    字符串 CSV解析 表格 逗号分隔值 通讯录 电话簿 MD
    Context Application 使用总结 MD
    RxJava RxPermissions 动态权限 简介 原理 案例 MD
    Luban 鲁班 图片压缩 MD
    FileProvider N 7.0 升级 安装APK 选择文件 拍照 临时权限 MD
    组件化 得到 DDComponent JIMU 模块 插件 MD
    gradlew 命令行 build 调试 构建错误 Manifest merger failed MD
    protobuf Protocol Buffers 简介 案例 MD
    ORM数据库框架 SQLite 常用数据库框架比较 MD
    [工具配置]requirejs 多页面,多入口js文件打包总结
  • 原文地址:https://www.cnblogs.com/hjf1223/p/mvc_validation_message_localize.html
Copyright © 2011-2022 走看看