编写强类型的Html帮助程序时会遇到一个常见问题。 问题是如何检索属性名称/值对。 假设我们有以下Html帮助声明:
public static string DatePickerFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, DateTime?>> expression)
我找到了几种解决方案: 1。
var value = expression.Compile()( helper.ViewData.Model );
string name = ExpressionHelper.GetExpressionText( expression );
string fullName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName( name );
2
ModelMetadata metadata = ModelMetadata.FromLambdaExpression( expression, helper.ViewData );
Object value = metadata.Model;
String name = metadata.PropertyName;
3。仅使用MemberExpression获取成员名称
string GetPropertyName<T>(Expression<Func<T>> property)
{
var propertyInfo = (property.Body as MemberExpression).Member as PropertyInfo;
if (propertyInfo == null)
{
throw new ArgumentException("The lambda expression 'property' should point to a valid Property");
}
return propertyInfo.Name;
}
所有这些都与第一次看起来有不同的实现(使用Reflector进行调查),但我没有深入研究。
我已经坚持了很多方法来解决问题,并且想知道哪种解决方案对于不同的情况更好,为什么?
我会感激任何帮助
答案 0 :(得分:3)
这些解决方案用于两种不同的环境。
1)视图使用正确的html字段前缀来准备模型绑定,并且几乎与ModelMetadata无关。如果您需要执行子表单,此代码将提供“Customer.Addresses [0] .City”。
此方法仅关注PropertyInfo.Name。这绝不会为您提供[DisplayName]
属性的内容。
2)主要用于使用Modelmetadata的是什么。除非你需要解决#1,否则我会在99%的时间内使用方法二。这还将获取与DataAnnotations属性关联的元数据。此窗台为您提供[DisplayName]
。