ASP.NET MVC - 将外部模型传递给编辑器模板

Ian*_*son 4 .net asp.net asp.net-mvc mvc-editor-templates razor

我正在为大多数表单使用自定义编辑器模板,但在尝试使用它们呈现自定义对象选择器时,我发现没有简单的方法将有关包含上下文的信息传递给编辑器模板.

具体来说,我的主窗体呈现域对象的编辑,编辑器模板需要呈现一个AJAX选择器,其中包含依赖于域对象ID的对象列表.我正在使用当前additionalViewData参数传递ID ,我认为这很容易出错,因此非常难看.

我的表单包含类似于以下内容的代码:

@Html.EditorFor(model => model.CategoryId, new { id = model.id })
Run Code Online (Sandbox Code Playgroud)

编辑器模板包含如下代码:

@{
var domainObjectId = ViewData["id"] as int?;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用自定义ModelMetadataProvider选择对象选择器编辑器模板,并希望使用类似的技术将有关包含模型的信息传递给编辑器模板,但这似乎不可能.

所以,我的问题是:

  1. 无论如何使用a ModelMetadataProvider将有关包含模型的信息传递给编辑器模板?
  2. 如果没有,除了通过弱类型additionalViewData参数传递每一条附加信息之外,还有更简洁/更容易的方法来实现我正在尝试的东西吗?

提前致谢!

Eri*_*sch 5

您需要了解EditorTemplates被设计为特定于类型,而不是特定于上下文.使用AdditionalViewData参数给出了一些想法,但这是你将获得的最好的.

如果您担心类型安全,请使用ViewBag,这是一个围绕ViewData的类型安全的动态包装器.

@{
    var domainObjectId = ViewBag.Id;
}
Run Code Online (Sandbox Code Playgroud)

  • @IanNewson - 我不明白你不愿意使用ViewBag,因为它真的是它的设计目标.我称之为"表布局思维".人们知道使用html表进行布局是不好的,所以他们停止使用表格来处理所有内容,甚至是实际的表格数据(你看到用div做的表格).同样,人们知道你应该使用ViewModels而不是ViewData/Bag,即使它被用于它的设计目的,也要远离它. (2认同)