. 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中有类似的东西吗?
有一个名为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>";