【问题标题】:HTMLHelper, generating parameter of type "Expression<Func<TModel, TValue>> expression" out of propertyHTMLHelper,从属性中生成“Expression<Func<TModel, TValue>> 表达式”类型的参数
【发布时间】:2013-04-19 15:10:29
【问题描述】:

我正在为编辑器编写 HTML Helper。这个想法是从具有 AutoGenerateField 属性的模型中获取属性并构建一个表,其中每一行包含一个字段的名称(也来自属性)和一个包含字段实际值的 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);
}

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    只使用非 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) member.Name 用于 input 元素上的 name html 属性。

    我现在无法完全验证它,因为我不在 Windows 上,但我认为非 lambda 函数应该适合您的需要。请告诉我进展如何?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多