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