我正在阅读http://www.orchardproject.net/docs/Creating-1-n-and-n-n-relations.ashx并且无法理解,如果可以轻松地进行主细节编辑,给出具体示例我已经附加了来自wordpress的截图:
因此,帖子和帖子包含一组自定义字段,简单的1:N关系,在一个页面中编辑的所有内容 - 您可以添加/编辑自定义字段而无需离开帖子页面。
可能有人在互联网上看到Orchard的相似例子,或者很快就可以通过代码描述实现这一目标的路径,这将非常有用(我希望不仅对我而言,因为这是我认为的常见情况)。
答案 0 :(得分:2)
这应该是可能的,尽管不是以最“Orchardy”的方式。
我没有测试下面的任何一个,所以它可能充满了错误 - 但也许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
方法的覆盖,以便在编辑零件时处理回发,并且我们可以恢复我们在前一个方法中传递的viewmodel:
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请求时可以读取它们,或者创建直接提交给控制器的单独嵌套表单。 / p>
所以你的观点可能会成为:
@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在客户端实现所有这些。
你可能需要做一些黑客攻击才能让编辑器在新的记录上工作(想想创建内容项而不是创建内容项),因为内容项(及其所有部分)尚不存在。
我希望这一切都有意义,如果您有任何问题,请告诉我: - )