1

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

public static MvcHtmlString EditorFor<TModel, TValue>(
    this HtmlHelper<TModel> html,
    Expression<Func<TModel, TValue>> expression
)

...文档非常容易理解地指出 TModel 是"The type of model"。一定是我特别倾向于这种描述对我没有任何意义。我用谷歌搜索了一个解释,但找到了 zilch。

我在一个视图中,@model Website.Models.Product但想为不同类型的东西创建一个编辑器。我以为我可以:

@Html.EditorFor(@ViewBag.AClassOfTheOtherType)

或者也许(我显然在猜测):

@Html.EditorFor(TheOtherType)

但这不是可接受的语法,所以我想:

@Html.EditorFor(x => x...)

但 lambda 表达式似乎绑定到@model......所以我想,“啊!”:

@Html.EditoFor<TheOtherType>(...)

但 VS 认为 < 开始一个 HTML 标记并指示我的 EditorFor 调用结束(失败)。

啊啊啊啊!

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

4

3 回答 3

2

没有测试过这个,但你不能这样做:

@Html.EditorFor(x => ViewBag.AClassOfTheOtherType)

您不一定需要使用传递给 Lambda 的变量。

于 2011-05-16T05:52:34.690 回答
0

答案是(请打鼓)...是的,可以将 lambda 表达式与类型声明符绑定。唯一的问题是 Visual Studio 编辑器,它认为一个正在结束 C# 部分并使用开头 < 输入 HTML 部分,因此不允许正确的代码。解决方案:

@{ Html.EditoFor<TheOtherType>(...) }
于 2011-05-22T01:55:35.480 回答
0

Model - 是 Model - MVC 中的 M

TModel 也可以是 sdserweJJG - 它只是一直被称为 TModel 不合常规。

在 EditorFor 的辅助方法中,您将看到如下内容:

 TValue val = expression.Compile()(htmlHelper.ViewData.Model);

这是扩展方法编译传入的 lambda - 例如x=>x.Model.Property零件 - 并取回实际模型数据以用于构建实际显示控件的地方。

当您return View(viewModel);从控制器操作调用时,模型将传递给视图。

您尝试做的事情没有意义,因为该方法旨在与视图模型一起使用。

但是,您可以使用@Html.Editor,因为这将以您尝试的方式获取实际值:

@Html.Editor(ViewBag.AClassOfTheOtherType)

MVC 的源代码可免费下载和查看 - 值得花时间这样做 :)

于 2011-05-15T20:24:38.947 回答