【问题标题】:Multiple Lambda Expressions as MVC Html Helper Parameters?多个 Lambda 表达式作为 MVC Html Helper 参数?
【发布时间】:2019-02-16 04:01:05
【问题描述】:

我正在尝试创建一个带有两个模型属性的 Html Helper。在下面的示例中,我的模型有两个字段 Height 和 HeightUnit。帮助程序中的代码将呈现一个 Bootstrap 文本框,其中包含输入组中单位的下拉列表。第一个模型属性绑定到文本框,第二个绑定到下拉列表。该代码在编译时不会出错,但是当它获取第二个表达式的显示名称时,它会失败并出现以下错误:

“模板只能用于字段访问、属性访问、一维数组索引或单参数自定义索引器表达式。”

这里是 Html Helper 声明:

public static MvcHtmlString MaterialTextBoxFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> textBoxExpression, Expression<Func<TModel, TValue>> dropDownListExpression, object htmlAttributes = null)
{
    string Id = htmlHelper.IdFor(textBoxExpression).ToString();
    string DisplayName = htmlHelper.DisplayNameFor(textBoxExpression).ToString();

    // this is coming out as blank
    string DDId = htmlHelper.IdFor(dropDownListExpression).ToString();
    // this is causing the error message displayed
    string DDDisplayName = htmlHelper.DisplayNameFor(dropDownListExpression).ToString();
}

这是我试图用来调用助手的剃须刀代码:

@Html.MaterialTextBoxFor(m => m.Height, m => m.HeightUnit)

有人知道怎么做吗?

【问题讨论】:

  • HeightHeightUnit 是同一类型吗?因为您要求它们具有相同的 TValue 类型。如果它们不是同一类型,则在渲染视图时会崩溃,因为那是它被编译的时候。如果您不关心类型并且想要所有任意类型,那么可以尝试 Expression&lt;Func&lt;TModel, object&gt;&gt; 或(如果 IdFor 需要正确的返回类型)使用 Expression&lt;Func&lt;TModel, TValue2&gt;&gt; 作为您的第二个表达式。
  • 谢谢!我尝试了与此类似的方法,但习惯于输入参数中的 TValues。我忘记了泛型是如何工作的。我现在有 TValue 和 TValue2 并且一切都按预期显示。

标签: c# asp.net-mvc razor lambda html-helper


【解决方案1】:

我最终确实找到了解决方案。关键是不要对数据源使用第二个表达式。而是将源创建为模型中的一个项目,但直接将其传递给助手。

public static MvcHtmlString CustomDropDownListFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, List<SelectListItem> DataSource, object htmlAttributes = null)

在模型内部,您需要有两个字段,一个用于存储选定的值,一个用于保存源数据:

public string MyField{ get; set; }
public List<SelectListItem> MyFieldSource { get; set; }

然后按如下方式调用助手:

@Html.CustomDropDownListFor(m => m.MyField, Model.MyFieldSource)

我在模型构造函数中填充“源”字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 2011-08-16
    相关资源
    最近更新 更多