这个非常有用的方法的签名表明我可以指出一个类型:
public static MvcHtmlString EditorFor<TModel, TValue>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression
)
...文档非常可以理解地说明TModel是“模型的类型”。我必须特别注意,这种描述对我来说没有任何意义。我用Google搜索了解释但发现了zilch。
我在@model Website.Models.Product
的视图中,但想要为不同类型的东西创建编辑器。我以为我可以:
@Html.EditorFor(@ViewBag.AClassOfTheOtherType)
或者(我显然在猜测):
@Html.EditorFor(TheOtherType)
但这是不可接受的语法,所以我想:
@Html.EditorFor(x => x...)
但lambda表达似乎绑定到@model
......所以我想,“啊!”:
@Html.EditoFor<TheOtherType>(...)
但VS认为&lt;启动一个HTML标记并指示我的EditorFor调用结束(失败)。
aaaaahhhhh!
我该怎么做(如果我真的需要问)?
答案 0 :(得分:2)
没有测试过,但你不能这样做:
@Html.EditorFor(x => ViewBag.AClassOfTheOtherType)
您不一定需要使用传递给Lambda的变量。
答案 1 :(得分:0)
模型 - 是模型 - MVC中的M
TModel也可以是sdserweJJG - 它只是一致地称为TModel。
在EditorFor的辅助方法中,您将看到如下内容:
TValue val = expression.Compile()(htmlHelper.ViewData.Model);
这是扩展方法编译传入的lambda的地方 - 例如x=>x.Model.Property
部分 - 并获取用于构建实际显示控件的实际Model数据。
当您从控制器操作中调用return View(viewModel);
时,模型将传递给视图。
您尝试做的事情没有意义,因为该方法旨在使用视图模型。
然而,您可以使用@Html.Editor
,因为这会以您尝试的方式获取实际值:
@Html.Editor(ViewBag.AClassOfTheOtherType)
MVC的源代码可免费下载和查看 - 非常值得花时间这样做:)
答案 2 :(得分:0)
答案是(鼓励请)...是的,可以将lambda表达式与类型声明符绑定。唯一的问题是Visual Studio编辑器,它认为一个正在结束C#部分并进入带有开头&lt;的HTML部分。因此不允许正确的代码。解决方案:
@{ Html.EditoFor<TheOtherType>(...) }