Asp.net mvc 数据注释本地化

Asp.net mvc 数据注释本地化,asp.net-mvc,asp.net-mvc-4,localization,data-annotations,Asp.net Mvc,Asp.net Mvc 4,Localization,Data Annotations,型号 [MetadataType(typeof(UserMetaData))] public class User { public int Id { get; set; } public string UserName { get; set; } } public class UserMetaData { public int Id { get; set; } [Required(ErrorMessageResourceType = typeof(Resou

型号

[MetadataType(typeof(UserMetaData))]
public class User
{
    public int Id { get; set; }
    public string UserName { get; set; }
}

public class UserMetaData
{
    public int Id { get; set; }

    [Required(ErrorMessageResourceType = typeof(Resources.ModelValidation), ErrorMessageResourceName = "UserNameRequired")]
    [LocalizedDisplayNameAttribute("UserName", NameResourceType = typeof(Resources.ModelValidation))]
    public string UserName { get; set; }
}
查看

@using (Html.BeginForm())
{
    <div>
        @Html.LabelFor(x => x.UserName)
        @Html.TextBoxFor(x => x.UserName)
        @Html.ValidationMessageFor(x => x.UserName)
    </div>
    <div>
        <input type="submit" value="Gönder" />
    </div>
}
资源文件

public class LocalizedDisplayNameAttribute : DisplayNameAttribute
{
    private PropertyInfo _nameProperty;
    private Type _resourceType;

    public LocalizedDisplayNameAttribute(string displayNameKey)
        : base(displayNameKey)
    { }

    public Type NameResourceType
    {
        get { return _resourceType; }
        set
        {
            _resourceType = value;
            //initialize nameProperty when type property is provided by setter  
            _nameProperty = _resourceType.GetProperty(base.DisplayName, BindingFlags.Static | BindingFlags.Public);
        }
    }
    public override string DisplayName
    {
        get
        {              
            //check if nameProperty is null and return original display name value  
            if (_nameProperty == null) { return base.DisplayName; }
            return (string)_nameProperty.GetValue(_nameProperty.DeclaringType, null);
        }
    }
}

输出

RequiredAttribute本地化工作正常,但LocalizedDisplayNameAttribute不工作。我找不到任何解决办法


有什么建议吗,缺失的地方在哪里?

您似乎正在用这个
LocalizedDisplayNameAttribute
属性重新设计轮子。此功能已内置到框架中,正好位于可直接使用的
[Display]
属性中:

public class UserMetaData
{
    public int Id { get; set; }

    [Required(ErrorMessageResourceType = typeof(Resources.ModelValidation), ErrorMessageResourceName = nameof(Resources.ModelValidation.UserNameRequired)]
    [Display(ResourceType = typeof(Resources.ModelValidation), Name = nameof(Resources.ModelValidation.UserName))]
    public string UserName { get; set; }
}

至于为什么你的车轮改造不起作用,嗯,不能肯定。不管怎样你都能摆脱它,为什么还要在意呢。

我不明白!为什么要扩展nameattr?此控件支持本地化作为重新查询ID@法尔斯,我不明白。你能解释一下吗?DisplayAttribute不支持本地化是的,当您提供ResourceType属性时,名称是resourceName!错误:
无法检索属性“Name”,因为本地化失败。类型“Resources.modelvalization”不是公共的,或者不包含名为“UserName”的公共静态字符串属性。
您的资源被设置为内部,因此它失败!检查打印屏幕@Fals,我知道这一点,但我无法改变。有什么建议吗?我不知道这是什么
Resources.modelvalization
。您应该将为您生成的类型放在那里。因此,例如,如果您将
Resources.resx
文件放在web应用程序的根目录中,并将
自定义工具设置为
PublicResXFileCodeGenerator
,并在此资源文件中定义
UserName
键,那么您的属性应该如下所示:
[Display(Name=“UserName”,ResourceType=typeof](资源))]
。这里的重要部分是将此资源文件的自定义工具设置为
PublicResXFileCodeGenerator
,以便设计器生成公共属性,而不是内部属性。好的,找到了它。请阅读我的回答:如果你想将资源文件保存在
应用程序\u GlobalResources
中,你必须将其设置为embe是的,在这种情况下应该使用
typeof(Resources.modelvalization)