HTMLHelper,生成类型为“Expression <func <tmodel,tvalue =”“>&gt;表达式”out of property </func <tmodel>的参数

时间:2013-04-19 15:10:29

标签: asp.net-mvc reflection html-helper

我正在为编辑器编写HTML Helper。我们的想法是使用属性AutoGenerateField从Model中获取属性并构建一个表,每个行包含一个字段的名称(也来自属性)和一个包含字段实际值的TextBox或CheckBox。

我的HTMLHelper有问题。由于我将整个模型发送给助手而不是一个值,因此我不能使用TextBoxFor等方法,因为它们需要参数,例如

"Expression<Func<TModel, TValue>> expression".

我正在使用反射,我尝试发送该属性,但VisualStudio仍认为这是错误的用法。

以下是我的HtmlHelper的简化方法:

public static MvcHtmlString GenerateEditor<TModel>(this HtmlHelper<TModel> htmlHelper)
{
    var model = htmlHelper.ViewData.Model;
    var result = String.Empty;

    //generating container, etc ...

    foreach (var property in model.GetType().GetProperties())
    {
        var attr = property.GetCustomAttributes(typeof (DisplayAttribute), true).FirstOrDefault(); 
        if (attr == null) continue;
        var autoGenerate = ((DisplayAttribute)attr).AutoGenerateField;
        if(autoGenerate)
        {
           //here I'm building the html string 
           //My problem is in the line below:
           var r = htmlHelper.TextBoxFor(property); 
        }
    }
    return MvcHtmlString.Create(result);
}

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

如何使用非lambda重载。 :InputExtensions.TextBox()

if(autoGenerate)
{
   //here I'm building the html string 
   //My problem is in the line below:
   var r = htmlHelper.TextBox(property.Name); 
}
//not sure what you do with r from here...

如果我没弄错,表单元素的name属性设置为属性名,即使你使用函数的lambda版本也应该这样做。

我会尝试验证lambda函数的作用,你可能也可以这样做,因为你有TModel


更新

通过InputExtensions.cs源代码内的快速浏览,TextBoxFor调用最终调用InputHelper(),最终调用ExpressionHelper.cs内的ExpressionHelper.GetExpressionText(LambdaExpression expression)从粗略的外观中获取输入元素上的名称html属性的member.Name

我现在无法完全验证它,因为我不在Windows上,但我认为非lambda函数应该适合您的需要。请告诉我它是怎么回事?