【发布时间】:2015-06-22 01:19:57
【问题描述】:
我正在尝试按照格式编写我的第一个客户 Html Helper 扩展方法
public static MvcHtmlString<TModel, TProperty>
MyHelperFor(this HtmlHelper<TModel> helper,
Expression<Func<TModel, TProperty>> expression)
似乎有几种不同的方法可以从expression 访问属性名称和值
var body = expression.Body as MemberExpression;
var propertyName = body.Member.Name;
var propertyInfo = typeof(TModel).getProperty(propertyName)
var propertyValue = propertyInfo.GetValue(helper.ViewData.Model);
和
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
var propertyName = metadata.PropertyName;
var propertyValue = metadata.Model;
还有
TModel model = (TModel)helper.ViewContext.ViewData.ModelMetadata.Model;
TProperty value = expression.Compile().Invoke(model);
有人可以解释这些方法之间的区别吗?有没有比其他人优越的情况?
【问题讨论】:
-
如果您检查 MVC source code 中的
System.Web.Mvc.Html,您会发现助手都使用第二个变体 -ModelMetadata.FromLambdaExpression(expression, html.ViewData);,所以我认为这是更好的方法
标签: c# asp.net-mvc razor reflection lambda