EditorFor + TModel

时间:2011-05-15 19:15:39

标签: asp.net-mvc-3 view razor editorfor

这个非常有用的方法的签名表明我可以指出一个类型:

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!

我该怎么做(如果我真的需要问)?

3 个答案:

答案 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>(...) }