这应该是可能的,尽管不是以最“果园”的方式。
我没有测试过以下任何内容,因此它可能充满了错误 - 但也许 Bertrand 或 Pszmyd 会在今天晚些时候纠正我:-)
您可能已经看到,您可以在编辑器驱动程序中创建内容形状时将视图模型传递给视图:
protected override DriverResult Editor(CatPart part, dynamic shapeHelper)
{
// Driver for our cat editor
var viewModel = new CatViewModel
{
Cats = _catService.GetCats() // Cats is IEnumerable<Cat>
};
return ContentShape("Parts_CatPart_Edit",
() => shapeHelper.EditorTemplate(
TemplateName: "Parts/CatPart",
Model: viewModel,
Prefix: Prefix
));
}
所以我们可以传入一个项目列表,并像这样在我们的视图中呈现它:
@foreach(var cat in Model.Cats)
{
<span class="cat">
<p>@cat.Name</p>
<a href="...">Delete Cat</p>
</span>
}
这里的问题是发回更改以更新模型。 Orchard 提供了对Editor 方法的覆盖,用于在编辑部件时处理回发,我们可以恢复我们在上一个方法中传递的视图模型:
protected override DriverResult Editor(CatPart part, IUpdateModel updater, dynamic shapeHelper)
{
var viewModel = new CatViewModel();
if (updater.TryUpdateModel(viewModel, Prefix, null, null))
{
// Access stuff altered in the Cat view model, we can then update the CatPart with this info if needed.
}
}
这对于字符串或整数等基本信息非常有效。 但是我一直无法使用(并且不确定是否可以使用)在客户端编辑的动态列表。
解决此问题的一种方法是为 1:N 关系的 N 端上的项目设置按钮,以便它们回发到 MVC 控制器。然后,此控制器可以更新模型并将客户端重定向回它们来自的编辑器,显示记录的更新版本。这将要求您始终如一地设置您在客户端添加的元素的 HTML ID/Name 属性,以便在向控制器发出 POST 请求时可以读取它们,或者创建直接提交给控制器的单独嵌套表单。
所以你的观点可能会变成:
@foreach(var cat in Model.Cats)
{
<form action="/My.Module/MyController/MyAction" method="POST">
<input type="hidden" name="cat-id" value="@cat.Id" />
<span class="cat">
<p>@cat.Name</p>
<input type="submit" name="delete" value="Delete Cat" />
</span>
</form>
}
<form action="/My.Module/MyController/AddItem" method="POST">
<input type="hidden" name="part-id" value="<relevant identifier>" />
<input type="submit" name="add" value="Add Cat" />
</form>
另一种可能性是创建一个控制器,该控制器可以将相关数据作为 XML/JSON 返回,并使用 Javascript 在客户端实现这一切。
由于内容项(及其所有部分)尚不存在,因此您可能需要进行一些修改才能使其在编辑器上工作以获取新记录(考虑创建内容项与创建内容项)。
我希望这一切都有意义,如果您有任何问题,请告诉我 :-)