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)
。