果园和主人细节编辑

时间:2011-06-28 14:01:02

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

我正在阅读http://www.orchardproject.net/docs/Creating-1-n-and-n-n-relations.ashx并且无法理解,如果可以轻松地进行主细节编辑,给出具体示例我已经附加了来自wordpress的截图:enter image description here

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

1 个答案:

答案 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在客户端实现所有这些。

你可能需要做一些黑客攻击才能让编辑器在新的记录上工作(想想创建内容项而不是创建内容项),因为内容项(及其所有部分)尚不存在。

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