MVC html助手如何使用表达式来获取对象属性

时间:2014-01-16 20:42:32

标签: c# asp.net-mvc model-view-controller expression

例如:

Html.TextBoxFor(x => x.ModelProperty)

如果我要将这样的表达式作为方法参数,我将如何从表达式中获取引用的属性?我对表达式的体验有点受限,根据我所知,我不明白这是如何工作的。

2 个答案:

答案 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;