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
  • 相关阅读:
    (转载)openwrt nginx
    *** 竞赛中的各种低级错误,及编程常见错误小结 ***
    信息学奥赛辅导经验谈 & 问题教学法中的学生思维能力培养
    数学&数论的一些题
    信息学竞赛中的一些经典思维 (题)
    从权值线段树到主席树
    浅谈莫队算法
    CSP-S 2019提高组训练 服务器需求
    NOIP2019 PJ 对称二叉树
    NOIP2017 PJ 跳房子 —— 单调队列优化DP
  • 原文地址:https://www.cnblogs.com/hjf1223/p/mvc_validation_message_localize.html
Copyright © 2011-2022 走看看