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

Nic*_*els 18 c# model-view-controller asp.net-mvc expression

例如:

Html.TextBoxFor(x => x.ModelProperty)
Run Code Online (Sandbox Code Playgroud)

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

Sel*_*enç 13

您可以像这样轻松获取属性名称:

var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
var propName = metadata.PropertyName;
Run Code Online (Sandbox Code Playgroud)

或者你可以得到财产及其属性:

MemberExpression memberExpression = (MemberExpression) expression.Body;
var member = memberExpression.Member as PropertyInfo;
var attributes = member.GetCustomAttributes();
Run Code Online (Sandbox Code Playgroud)

例如,您可以编写一个生成如下输入元素的简单方法:

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());

    }
Run Code Online (Sandbox Code Playgroud)

看看我的答案.


Mar*_*ijn 8

我曾经写过自己的EditorFor,它有以下定义:

public static MvcHtmlString MyHtmlEditorFor<TModel, TProperty>(this HtmlHelper<TModel> h, Expression<Func<TModel, TProperty>> expression)
{
  // ...
}
Run Code Online (Sandbox Code Playgroud)

要获取属性的信息,我使用了ModelMetadata类:

ModelMetadata m = ModelMetadata.FromLambdaExpression(expression, h.ViewData);
var value = m.Model;
Run Code Online (Sandbox Code Playgroud)