Che*_*rek 7 asp.net-mvc lambda modelmetadata
编写强类型的Html助手有一个共同的问题.问题是如何检索属性名称/值对.假设我们有以下Html帮助声明:
public static string DatePickerFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, DateTime?>> expression)
Run Code Online (Sandbox Code Playgroud)
我找到了几种解决方案:1.
var value = expression.Compile()( helper.ViewData.Model );
string name = ExpressionHelper.GetExpressionText( expression );
string fullName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName( name );
Run Code Online (Sandbox Code Playgroud)
2.
ModelMetadata metadata = ModelMetadata.FromLambdaExpression( expression, helper.ViewData );
Object value = metadata.Model;
String name = metadata.PropertyName;
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
所有这些都有不同的实现从第一次看(使用Reflector调查),但我没有深入挖掘.
我已经坚持了很多方法来解决问题,并想知道哪种解决方案对于不同的情况更好,为什么?
我会感激任何帮助
这些解决方案用于两种不同的环境。
1) 视图使用它来正确地为 html 字段添加前缀,以准备模型绑定,并且与 ModelMetadata 几乎无关。如果您需要执行子表单,此代码将提供“Customer.Addresses[0].City”。
该方法只关心PropertyInfo.Name。这永远不会为您提供属性的内容[DisplayName]。
2) 主要用于处理模型元数据。99% 的时间我都会使用方法二,除非你需要解决#1。这还将获取与 DataAnnotations 属性关联的元数据。这将为您提供 的内容[DisplayName]。
| 归档时间: |
|
| 查看次数: |
2410 次 |
| 最近记录: |