【发布时间】: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)
有人知道怎么做吗?
【问题讨论】:
-
Height和HeightUnit是同一类型吗?因为您要求它们具有相同的TValue类型。如果它们不是同一类型,则在渲染视图时会崩溃,因为那是它被编译的时候。如果您不关心类型并且想要所有任意类型,那么可以尝试Expression<Func<TModel, object>>或(如果 IdFor 需要正确的返回类型)使用Expression<Func<TModel, TValue2>>作为您的第二个表达式。 -
谢谢!我尝试了与此类似的方法,但习惯于输入参数中的 TValues。我忘记了泛型是如何工作的。我现在有 TValue 和 TValue2 并且一切都按预期显示。
标签: c# asp.net-mvc razor lambda html-helper