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

C# MVC html助手如何使用表达式获取对象属性,c#,asp.net-mvc,model-view-controller,expression,C#,Asp.net Mvc,Model View Controller,Expression,例如: Html.TextBoxFor(x => x.ModelProperty) 如果将这样的表达式作为方法参数,如何从表达式中获取引用的属性?我对表达式的经验有点有限,根据我所知道的,我不知道它是如何工作的。我曾经写过自己的EditorFor,它有以下定义: public static MvcHtmlString MyHtmlEditorFor<TModel, TProperty>(this HtmlHelper<TModel> h, Expression&l

例如:

Html.TextBoxFor(x => x.ModelProperty)

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

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

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

您可以通过以下方式轻松获取属性名称:

var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
var propName = metadata.PropertyName;
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());

    }
或者,您可以获取属性及其属性:

MemberExpression memberExpression = (MemberExpression) expression.Body;
var member = memberExpression.Member as PropertyInfo;
var attributes = member.GetCustomAttributes();
例如,您可以编写一个简单的方法,生成如下输入元素:

var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
var propName = metadata.PropertyName;
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());

    }
public static MvcHtmlString TextboxForCustom(此HtmlHelper html,
表达式(表达式)
{
var metadata=modelmetada.FromLambdaExpression(表达式,html.ViewData);
var propName=metadata.PropertyName;
StringBuilder sb=新的StringBuilder();
sb.AppendFormat(“,propName”);
返回MvcHtmlString.Create(sb.ToString());
}

看看这里。

出于好奇,你为什么说
var-value
,但显式地调用
m
的类型,而不仅仅是
var m
,尤其是当
m
的类型很明显时?因为模型可以是任何对象。。。他可能是不同的特定对象,也可能是使用过的对象。@RobertHarvey我在回答中添加了这一行作为示例,事实上,我在将其转换为显式类型之前对该类型进行了一些检查。我使用MVC html helpers作为示例,说明了我在哪些方面使用了它。