例如:
Html.TextBoxFor(x => x.ModelProperty)
如果我要将这样的表达式作为方法参数,我将如何从表达式中获取引用的属性?我对表达式的体验有点受限,根据我所知,我不明白这是如何工作的。
答案 0 :(得分:13)
您可以轻松地获取属性名称:
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
var propName = metadata.PropertyName;
或者你可以获得财产及其属性:
MemberExpression memberExpression = (MemberExpression) expression.Body;
var member = memberExpression.Member as PropertyInfo;
var attributes = member.GetCustomAttributes();
例如,您可以编写一个生成如下输入元素的简单方法:
public static MvcHtmlString TextboxForCustom<TModel, TResult>(this HtmlHelper<TModel> html,
Expression<Func<TModel, TResult>> expression)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
var propName = metadata.PropertyName;
StringBuilder sb = new StringBuilder();
sb.AppendFormat("<input type=\"text\" id=\"{0}\" />", propName);
return MvcHtmlString.Create(sb.ToString());
}
在这里查看my answer。
答案 1 :(得分:8)
我曾经写过自己的EditorFor
,它有以下定义:
public static MvcHtmlString MyHtmlEditorFor<TModel, TProperty>(this HtmlHelper<TModel> h, Expression<Func<TModel, TProperty>> expression)
{
// ...
}
要获取属性的信息,我使用了ModelMetadata类:
ModelMetadata m = ModelMetadata.FromLambdaExpression(expression, h.ViewData);
var value = m.Model;