多个 Lambda 表达式作为 MVC Html 辅助参数?

Multiple Lambda Expressions as MVC Html Helper Parameters?

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

"Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions."

这里是 Html 助手声明:

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)

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

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

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)

我在模型构造函数中填充 "source" 字段。