4

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

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

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

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

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

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

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

所以,我的问题是:

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

提前致谢!

4

2 回答 2

5

您需要了解 EditorTemplates 被设计为特定于类型,而不是特定于上下文。使用 AdditionalViewData 参数对此进行了一些思考,但这是您将获得的最佳结果。

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

@{
    var domainObjectId = ViewBag.Id;
}
于 2013-04-17T16:49:30.470 回答
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)

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

于 2013-04-17T16:41:47.407 回答