. net中用户友好的属性名,就像Rails中的那些

本文关键字:就像 Rails 那些 属性 net 用户 | 更新日期: 2023-09-27 17:52:34

在Ruby on Rails中,配置中有一个YAML文件,它允许您定义模型属性名的纯英文版本。实际上,它允许您定义纯语言版本:它是国际化的一部分,但大多数人将它用于向用户显示模型验证结果之类的事情。

我需要这种功能在我的。net MVC 4项目。用户提交一个表单,并收到一封包含他们发布的几乎所有内容的电子邮件(表单被绑定到一个模型)。我写了一个助手方法,通过反射来转储一个HTML表的属性/值对,例如

foreach (PropertyInfo info in obj.GetType()
    .GetProperties(BindingFlags.Public | 
                   BindingFlags.Instance | 
                   BindingFlags.IgnoreCase)) 
{
  if (info.CanRead && !PropertyNamesToExclude.Contains(info.Name)) 
  {
    string value = info.GetValue(obj, null) != null ? 
                                            info.GetValue(obj, null).ToString() :
                                            null;
    html += "<tr><th>" + info.Name + "</th><td>" + value + "</td></tr>";
  }
}

但是,当然,这打印出info.Name像"OrdererGid",当也许"Orderer Username"会更好。在。net中有类似的东西吗?

. net中用户友好的属性名,就像Rails中的那些

有一个名为DisplayName的数据属性允许您这样做。只需用这个注释你的模型属性,并为每个

指定一个友好的名称
[DisplayName("Full name")]
public string FullName { get; set; }

非常感谢@Stokedout和@Clemens的回答。实际上通过反射访问有点复杂。由于某种原因,我不能直接访问CustomAttributes属性。最后来到这个:

DisplayNameAttribute dna = (DisplayNameAttribute)info
    .GetCustomAttributes(typeof(DisplayNameAttribute), true).FirstOrDefault();
string name = dna != null ? dna.DisplayName : info.Name;
string value = info.GetValue(obj, null) != null ? 
     (info.GetValue(obj, null).GetType().IsArray ? 
           String.Join(", ", info.GetValue(obj, null) as string[]) : 
           info.GetValue(obj, null).ToString()) : 
      null;
html += "<tr><th>" + name + "</th><td>" + value + "</td></tr>";
相关文章: