• 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))]

     

  • 相关阅读:
    Java静态代理学习
    Java反射学习三
    Java反射学习二
    Java反射学习一
    Java反射学习四
    linux下vim命令详解
    linux安装jdk
    转 知道这20个正则表达式,能让你少写1,000行代码
    excel函数2
    excel函数
  • 原文地址:https://www.cnblogs.com/lidaying5/p/13207310.html
Copyright © 2020-2023  润新知