编写强类型的Html助手有一个常见的问题。问题是如何检索属性名称/值对。假设我们有以下Html helper声明:
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;仅使用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来研究),但我并没有深入研究。
我坚持使用了这么多方法来解决问题,我想知道哪种解决方案更适合不同的情况,为什么?
我将非常感谢您的任何帮助。
发布于 2010-10-17 23:18:37
这些解决方案用于两种不同的上下文。
1)被视图用来为html字段添加适当的前缀以准备模型绑定,并且几乎与ModelMetadata无关。此代码将提供"Customer.Addresses.City“,以备您需要执行子窗体时使用。
这个方法只关心PropertyInfo.Name。这永远不会为您提供[DisplayName]属性的内容。
2)主要用于处理模型元数据。我会使用方法2 99%的时间,除非你需要解决#1。这也会得到与DataAnnotations属性相关的元数据。这将为您提供[DisplayName]的内容。
https://stackoverflow.com/questions/3953525
复制相似问题