【问题标题】:Orchard and master detail editing果园和主细节编辑
【发布时间】:2011-09-24 08:38:04
【问题描述】:

我正在阅读 http://www.orchardproject.net/docs/Creating-1-n-and-n-n-relations.ashx 并且无法理解,如果可以轻松地进行主细节编辑,给你一个具体的例子,我附上了来自 wordpress 的截图:

因此,帖子和帖子包含一组自定义字段,简单的 1:N 关系,所有内容都在一个页面中编辑 - 您可以添加/编辑自定义字段而无需离开帖子页面。
可能有人在互联网上看到类似的 Orchard 示例,或者可以简短地描述通过代码实现此目标的路径,这将非常有帮助(我希望不仅对我,因为我认为这是很常见的情况)。

【问题讨论】:

  • 您是尝试将其作为普通的 ASP MVC 控制器还是在可以附加到内容项的内容部分上执行此操作?
  • 我在考虑内容部分。

标签: asp.net asp.net-mvc-3 orchardcms


【解决方案1】:

这应该是可能的,尽管不是以最“果园”的方式。

我没有测试过以下任何内容,因此它可能充满了错误 - 但也许 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 在客户端实现这一切。

由于内容项(及其所有部分)尚不存在,因此您可能需要进行一些修改才能使其在编辑器上工作以获取新记录(考虑创建内容项与创建内容项)。

我希望这一切都有意义,如果您有任何问题,请告诉我 :-)

【讨论】:

  • 嗯,我知道我需要先自己尝试很多事情,以便更熟悉 Orchard 中的一切运作方式,到目前为止一切都不是那么简单。我会在几天内将问题保持开放状态,如果没有更好的答案,我会将您的帖子标记为答案。
  • 抱歉挖掘了一个旧帖子,但是如果不使用驱动程序,您将如何完成相同的操作?我假设你会在控制器中做驱动程序?你能给我举个例子吗?非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多