Как помощники MVC html используют выражения для получения свойства объектов

Например:

Html.TextBoxFor(x => x.ModelProperty)

Если бы я хотел получить такое выражение как аргумент метода, как бы получить ссылочное свойство из выражения? Мой опыт с выражениями несколько ограничен и основан на том, что я знаю, я не понимаю, как это работает.

Ответы

Ответ 1

Вы можете легко получить имя свойства:

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

    }

Посмотрите мой ответ здесь.

Ответ 2

Я как-то написал свой собственный 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;