【问题标题】:Orchard persist viewmodel in driver果园在驱动程序中保留视图模型
【发布时间】:2014-07-17 12:35:30
【问题描述】:

我有一个包含多个部分的内容类型,其中一个可以添加由多个点组成的议程,包括日期、时间、标题和富文本描述。换句话说,一个 1-n 关系。 这部分使用视图模型来提交对象列表。 用户在提交之前可能已经在议程上花费了一些时间,并且如果任何其他部分没有验证他们当前在议程上的所有工作都丢失了。 这并不意外,因为重新加载页面时会创建一个新的视图模型。

但是我不禁注意到部件中的任何信息都会保留,我希望有一种方法可以将数据也保留在视图模型中。

驱动有以下方法:

protected override DriverResult Editor(AgendaPart part, dynamic shapeHelper)
{
    return ContentShape("Parts_Agenda_Edit",
        () => shapeHelper.EditorTemplate(
            TemplateName: "Parts/Agenda",
            Model: BuildEditorViewModel(part),
            Prefix: Prefix));
}

protected override DriverResult Editor(AgendaPart part, IUpdateModel updater, dynamic shapeHelper)
{
    var model = new AgendaViewModel();
    updater.TryUpdateModel(model, Prefix, null, null);

    if (part.ContentItem.Id != 0)
    {
        _agendaService.CreateUpdateAgenda(model, part.ContentItem);
    }

    return Editor(part, shapeHelper);
}

提交时,我得到这样的视图模型:

var model = new AgendaViewModel();
updater.TryUpdateModel(model, Prefix, null, null);

在加载编辑器以获取任何预先存在的视图模型数据时,有什么“类似”可以做的吗? 如果没有,那么也欢迎任何其他建议。

【问题讨论】:

    标签: c# asp.net-mvc orchardcms orchardcms-1.8


    【解决方案1】:

    ASP.NET MVC 提供了一种跨请求持久保存此类数据的机制:TempData。你可以在这个控制器中看到一个例子:https://bitbucket.org/bleroy/nwazet.commerce/src/b558d7988c4f6c66cdd0b2dd6b533d8ad3bfbceb/Controllers/StripeController.cs?at=default

    我还想明确指出 TryUpdateModel 没有做任何持久性工作。它的作用是将客户端提交的数据(通常是表单数据)映射到您传入的对象上。部分记录是跟踪更改的内容,然后可以由 Orchard 自动持久化。

    【讨论】:

    • 这个例子是针对控制器的,是否有一个可以从 ContentPartDriver 获得的 TempDataDictionary?
    • 您可以从过滤器访问它:它将是控制器上的一个属性,它本身就是过滤器上下文的一个属性。然后,您可以将其复制到当前请求的 Items 或 Layout 的动态属性上,您可以从驱动程序访问这些属性。 Session 是另一种可以工作的存储类型,可以通过当前 HTTP 上下文从任何地方访问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 2018-10-13
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    相关资源
    最近更新 更多