MVC5 验证信息实现多语言

基本环境:VS2019+EF6,根据https://www.cnblogs.com/lidaying5/p/12756661.html进行多语言设置,添加资源文件,语言切换按钮,添加资源文件键值对Email,PropertyValueRequired等

验证信息实现多语言主要分为两部分:

1.Modal字段名实现多语言

2.错误信息实现多语言

1.modal字段实现多语言

Display特性可以指定资源文件和对应的键,遗憾的是这样会引发一个报错,因为默认创建的资源文件不是公共的

Cannot retrieve property 'Name' because localization failed.  Type 'Resources.Resource' is not public or does not contain a public static string property with the name 'Email

有人说修改资源文件属性可以解决这个问题,但是我试过并不行,网上解决方法:

要解决这个问题,只要右键点击资源文件,在其的属性中将 Custom Tool 从 GlobalResourceProxyGenerator 改为 PublicResXFileCodeGenerator ,然后将 Build Action 改为 Embedded Resource,最后要给 Custom Tool Namespace 起个名字用作这个资源的名字空间,在原文中说可以不要,但在本人使用中发现还是要的,要不然在代码中无法引用资源文件。

原文:http://cs1125.lofter.com/post/13bf89_471235

    public class LoginUser
    {
        [Display(Name ="Email" ,ResourceType = typeof(Resources.Resource))]
        public string Email { get; set;}

        [Required]
        public string Password { get; set; }
        public bool? RememberMe { get; set; }

    }

第一种方法不行,网上找了第二种方法,通过自定义Displayed属性实现字段多语言显示 https://www.cnblogs.com/whtydn/p/5305798.html

public class LocalizedDisplayName : DisplayNameAttribute 
{ 
        private string _defaultName = "" ; 

        public Type ResourceType { get ; set ; } 

        public string ResourceName { get ; set ; } 

        public LocalizedDisplayName ( string defaultName ) { _defaultName = defaultName ; } 

        public override string DisplayName 
        { 
            get 
            { 
                PropertyInfo p = ResourceType . GetProperty ( ResourceName ) ; 

                if ( p != null ) 
                { 
                    return p . GetValue ( null , null ) . ToString ( ) ; 
                } 
                else 
                { 
                    return _defaultName ; 
                } 
            } 
        } 
}
[ LocalizedDisplayName ( "姓名" , ResourceName = "Name" , ResourceType = typeof ( Resources . Admin ) ) ] 
[ Required ( ) ] 
Public string Name { get ; set ; }

但是PropertyInfo p = ResourceType . GetProperty ( ResourceName ) ; 并不能获取到对应的属性,网上查了资料大概意思是反射不支持内部属性

 既然不能用反射,索性把反射去掉直接调用资源文件好了,读取本地资源要加try...catch 否则添加带视图控制器时会出错(下图3),大概是添加时编译器试图去获取资源文件了, 修改后代码如下

    public class LocalizedDisplayName : DisplayNameAttribute
    {
        private string _ResourceName = "";


        public LocalizedDisplayName(string ResourceName) { _ResourceName = ResourceName; }

        public override string DisplayName
        {
            get
            {
                try
                {
                    var value = Resources.Resource.ResourceManager.GetString(_ResourceName);
                    if (!string.IsNullOrEmpty(value))
                    {
                        return value;
                    }
                    else
                    {
                        return _ResourceName;
                    }
                }
                catch (Exception ex)
                {
                    return _ResourceName;
                }

                
            }
        }
    }
    public class LoginUser
    {
        [Required( ErrorMessageResourceName = "PropertyValueRequired", ErrorMessageResourceType =typeof(Resources.Resource))]
        [LocalizedDisplayName("Email")]
        public string Email { get; set;}

        [Required]
        public string Password { get; set; }
        public bool? RememberMe { get; set; }

    }

切换中英文,成功显示

 

 字段的多语言显示实现。

2.错误信息的多语言

这个就更加容易实现了,比如Requierd特性都有ErrorMessageResourceName ErrorMessageResourceType 两个属性,只要指定资源文件和资源文件键值就可以了,资源文件可以使用{0} is required!形式添加错误信息,显示时会替换对应的字段名

 [Required( ErrorMessageResourceName = "PropertyValueRequired", ErrorMessageResourceType =typeof(Resources.Resource))]

 

原文地址:https://www.cnblogs.com/lidaying5/p/13207310.html