为了账号安全,请及时绑定邮箱和手机立即绑定

资源中的DisplayName属性?

/ 猿问

资源中的DisplayName属性?

守候你守候我 2019-08-24 18:14:56

资源中的DisplayName属性?

我有一个本地化的应用程序,我想知道是否可以DisplayName从资源中设置某个模型属性。

我想做这样的事情:

public class MyModel {
  [Required]
  [DisplayName(Resources.Resources.labelForName)]
  public string name{ get; set; }}

但是我不能这样,因为编译器说:“属性参数必须是常量表达式,typeof表达式或属性参数类型的数组创建表达式”:(

有没有解决方法?我手动输出标签,但我需要这些用于验证器输出!


查看完整描述

3 回答

?
倚天杖

如何编写自定义属性:

public class LocalizedDisplayNameAttribute: DisplayNameAttribute{
    public LocalizedDisplayNameAttribute(string resourceId) 
        : base(GetMessageFromResource(resourceId))
    { }

    private static string GetMessageFromResource(string resourceId)
    {
        // TODO: Return the string from the resource file
    }}

可以像这样使用:

public class MyModel {
    [Required]
    [LocalizedDisplayName("labelForName")]
    public string Name { get; set; }}


查看完整回答
反对 回复 2019-08-24
?
隔江千里

如果使用MVC 3和.NET 4,则可以DisplaySystem.ComponentModel.DataAnnotations命名空间中使用new 属性。此属性替换DisplayName属性并提供更多功能,包括本地化支持。

在你的情况下,你会像这样使用它:

public class MyModel{
    [Required]
    [Display(Name = "labelForName", ResourceType = typeof(Resources.Resources))]
    public string name{ get; set; }}

作为旁注,此属性不适用于内部App_GlobalResourcesApp_LocalResources。这与GlobalResourceProxyGenerator这些资源使用的自定义工具()有关。而是确保您的资源文件设置为“嵌入资源”并使用“ResXFileCodeGenerator”自定义工具。

(作为进一步的附注,你不应该使用App_GlobalResourcesApp_LocalResources使用MVC。你可以在这里阅读更多关于为什么会这样的情况)


查看完整回答
反对 回复 2019-08-24
?
慕莱坞森
public class Person{
    // Before C# 6.0
    [Display(Name = "Age", ResourceType = typeof(Testi18n.Resource))]
    public string Age { get; set; }

    // After C# 6.0
    // [Display(Name = nameof(Resource.Age), ResourceType = typeof(Resource))]}
  1. 定义属性的ResourceType,以便查找资源

  2. 定义用于资源键的属性的名称,在C#6.0之后,您可以使用nameof强类型支持而不是硬编码键。

  3. 在控制器中设置当前线程的文化。

Resource.Culture = CultureInfo.GetCultureInfo("zh-CN");

  1. 将资源的可访问性设置为public

  2. 像这样在cshtml中显示标签

@Html.DisplayNameFor(model => model.Age)


查看完整回答
反对 回复 2019-08-24

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信