代码之家  ›  专栏  ›  技术社区  ›  LukLed

是否可以对具有强类型资源的labelfor、validationmessagefor、editorfor使用数据注释?

  •  5
  • LukLed  · 技术社区  · 14 年前

    我想在我的ASP.NET MVC应用程序中使用DataAnnotations。我有强类型资源类,希望在我的视图模型中定义:

    [DisplayName(CTRes.UserName)]
    string Username;
    

    CTRes 是我的资源,自动生成的类。不允许使用上述定义。还有其他的解决办法吗?

    3 回复  |  直到 13 年前
        1
  •  0
  •   Community SqlRyan    7 年前

    属性不能这样做

    看见 C# attribute text from resource file?

    resource.resourcename将是字符串属性,属性参数只能是常量、枚举、typeofs

        2
  •  7
  •   Darin Dimitrov    14 年前

    这里有 DisplayAttribute 已添加到.NET 4.0中,允许您指定资源字符串:

    [Display(Name = "UsernameField")]
    string Username;
    

    如果您还不能使用.NET 4.0,您可以编写自己的属性:

    public class DisplayAttribute : DisplayNameAttribute
    {
        public DisplayAttribute(Type resourceManagerProvider, string resourceKey)
            : base(LookupResource(resourceManagerProvider, resourceKey))
        {
        }
    
        private static string LookupResource(Type resourceManagerProvider, string resourceKey)
        {
            var properties = resourceManagerProvider.GetProperties(
                BindingFlags.Static | BindingFlags.NonPublic);
    
            foreach (var staticProperty in properties)
            {
                if (staticProperty.PropertyType == typeof(ResourceManager))
                {
                    var resourceManager = (ResourceManager)staticProperty
                        .GetValue(null, null);
                    return resourceManager.GetString(resourceKey);
                }
            }
            return resourceKey;
        }
    }
    

    你可以这样使用:

    [Display(typeof(Resources.Resource), "UsernameField"),
    string Username { get; set; }
    
        3
  •  0
  •   bkaid    14 年前

    如上文所述,这在MVC3中起到了应有的作用。 ScottGu's post ,并允许您将内置的displayattribute与本地化的资源文件一起使用。