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

时间:2013-04-16 16:11:10

标签: asp.net .net asp.net-mvc razor mvc-editor-templates

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

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

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

@Html.EditorFor(model => model.CategoryId, new { id = model.id })

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

@{
var domainObjectId = ViewData["id"] as int?;
}

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

所以,我的问题是:

  1. 是否仍然使用ModelMetadataProvider将有关包含模型的信息传递给编辑器模板?
  2. 如果没有,除了通过弱类型additionalViewData参数传递每一条附加信息外,还有更简洁/更容易实现我尝试的方法吗?
  3. 提前致谢!

2 个答案:

答案 0 :(得分:5)

您需要了解EditorTemplates是针对特定类型而非特定于上下文的。使用AdditionalViewData参数给出了一些想法,但这是你最好的。

如果您担心类型安全,请改用ViewBag,这是ViewData的类型安全动态包装。

@{
    var domainObjectId = ViewBag.Id;
}

答案 1 :(得分:0)

我想知道是否可能首先创建此视图模型的控制器应该是选择对象列表的东西。因此,您可以拥有另一种视图模型的子属性,而不是在视图模型上具有整数属性,即:

public class OuterViewModel
{
    public CategoryViewModel Category { get; set; }
}

public class CategoryViewModel
{
    public int CategoryId { get; set; }

    public IEnumerable<SelectListItem> ListOfThings { get; set; }
}

然后您的原始视图可以包含:

@Html.EditorFor(model => model.Category)

使用适用于CategoryViewModel的EditorTemplate,如下所示:

@model CategoryViewModel
@Html.DropDownFor(m => m.CategoryId, Model.ListOfThings)

您唯一需要记住的是,如果您进行任何服务器端业务逻辑验证,添加模型错误并返回到您的视图,则需要重新填充控制器后期操作中的事项列表。