asp.net - Orchard 和主要细节编辑

标签 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 关系,在一个页面中编辑的所有内容 - 您可以在不离开帖子页面的情况下添加/编辑自定义字段。
可能有人在 Internet 上看到了 Orchard 的类似示例,或者可以简短地描述通过代码实现此目的的路径,这将非常有帮助(我希望不仅对我有用,因为我认为这是很常见的情况)。

最佳答案

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

我没有测试以下任何内容,所以它可能充满错误 - 但也许 Bertrand 或 Pszmyd 今天晚些时候会来纠正我:-)

正如您可能已经看到的,您可以在编辑器驱动程序中创建内容形状时将 View 模型传递给 View :

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
        ));
}

所以我们可以传入一个项目列表,并像这样在我们的 View 中呈现它:

@foreach(var cat in Model.Cats)
{
    <span class="cat">
        <p>@cat.Name</p>
        <a href="...">Delete Cat</p>
    </span>
}

这里的问题是回发更改以更新模型。 Orchard 提供了 Editor 方法的重写来处理编辑部分时的回发,我们可以恢复我们在之前方法中传递的 View 模型:

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 Controller 。然后这个 Controller 可以更新模型并将客户端重定向回他们来自的编辑器,显示记录的更新版本。这将要求您始终如一地设置您在客户端添加的元素的 HTML ID/名称属性,以便在向您的 Controller 发出 POST 请求时可以读取它们,或者创建单独的嵌套表单直接提交给 Controller 。

所以你的 View 可能变成:

@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>

另一种可能性是创建一个 Controller ,它可以将相关数据作为 XML/JSON 返回,并在客户端使用 Javascript 实现这一切。

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

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

关于asp.net - Orchard 和主要细节编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6507662/

相关文章:

orchardcms - 如何为 Orchard 布局创建自定义容器元素?

asp.net - 在混合Webforms MVC应用程序中使用IExceptionFilter

asp.net - 当页面显示在 jQuery 对话框和 iFrame 中时调整图像大小

asp.net-mvc-3 - SelectList 中的本地化枚举字符串

nhibernate - 了解 Orchard 连接和数据关系

postgresql - Orchard CMS 在 postgresql 数据库上运行的可能性有多大?

mysql - 如何在asp页面调用sql函数来填充表的列

c# - 登录 asp.net 应用程序的建议

c# - 反序列化复杂对象中的 xml

c# - 无法在 RedirectToAction 上传递多个参数