HTMLHelper,生成属性外"Expression<Func<TModel, TValue>> expression"类型的参数



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

我有一个问题与HTMLHelper。由于我将整个模型发送给helper而不是一个值,因此我不能使用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);
}

任何想法?

使用非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.GetExpressionText(LambdaExpression expression)在ExpressionHelper.cs从粗略的外观的东西得到member.Name的名称html属性的输入元素。

我现在不能验证它,因为我不是在windows上,但我认为非lambda函数应该适合您的需要。告诉我是怎么回事吧?

相关内容

  • 没有找到相关文章