多个Lambda表达式作为MVC HTML Helper参数?

问题描述 投票:1回答:1

我正在尝试创建一个具有两个模型属性的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)

有人知道如何进行这项工作吗?

c# asp.net-mvc razor lambda html-helper
1个回答
0
投票

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

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)

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

© www.soinside.com 2019 - 2024. All rights reserved.