【问题标题】:How to force two instance of the same app (DNN/2sxc) to read from the same stream?如何强制同一应用程序(DNN/2sxc)的两个实例从同一流中读取?
【发布时间】:2017-02-20 16:30:05
【问题描述】:

对不起,如果我的问题很愚蠢,但我是 DNN/2sxc 的新手,我已经花了一整天的时间试图解决这个问题,但没有成功..

我有同一个应用程序的两个实例,一个在主页上,另一个在自己的页面上,每个都必须有自己的视图模板(我使用 Razor)。

我的问题是我想不出办法让两个应用程序读取相同的数据,因此其中一个应用程序中的每个添加/编辑/删除/重新排序都会反映到另一个应用程序中,目前每个应用程序都有自己的数据因此它们在我的情况下无法使用。

我尝试在“数据查询”中使用“EntityTypeFilter”并在两个视图中使用它(如在 News-Simple 演示视频中),它有效并为我提供了两个视图中的所有项目,但是这个解决方案还有另外两个问题:

1- 现在我无法使用工具栏来(添加/删除/重新排序,.. 等)任何项目,正如您在 image 中看到的那样,这对我来说是一个阻碍,

注意:这是我使用的工具栏:

@foreach(var item in AsDynamic(Data["Default"]))
{
...
@Edit.Toolbar(target: item, actions: "new,edit,replace,remove,moveup,movedown,instance-list")

2- 'Content Demo Item' 在列表中也可见,但它并不重要,因为我可以删除它并将其中一个真实数据项用作演示项。

感谢任何形式的帮助。 谢谢。

【问题讨论】:

    标签: dotnetnuke 2sxc


    【解决方案1】:

    因此,您首先应该知道的是,将内容项用作数据(用于查询等)和将其用作分配项(其中每个模块实例都有一个项子集)时的区别。以下博客应该可以帮助您了解其中的区别:http://2sxc.org/en/blog/post/12-differences-when-templating-data-instead-of-content

    因此,当您想要“手动轻松地控制显示的确切项目、它们的顺序等”时。您想使用“content-assigned-to-instance”,它还为您提供了简单的添加、删除按钮,因为这些按钮并没有真正删除任何内容,而只是从模块实例中删除了分配。

    现在您的情况有点特殊,因为您想在另一个模块实例中重复使用完全相同的集合。有几种方法可以做到这一点:

    相同的视图

    如果是完全相同的视图等,只需使用 DNN 功能复制模块(将现有模块添加到另一个页面)

    不同的观点

    如果是不同的视图(可能更紧凑等),您将再次拥有多种选择。第一种是使用 dnn 功能进行镜像/复制,然后只放置一个 if-im-on-this-page-then-show-differently 或注入另一个 CSS。这可能是没有任何开发知识的最简单的方法。

    更难但可能更好的方法是实际使用新模板,并告诉它以在其他模块中配置的方式检索项目 - 假设模块 1 是原始的,模块 2 有一个不同的模板想要以与 1 中给出的完全相同的顺序访问模块 1 的项目。他们做到这一点的方法很简单,但需要模块 2 中的几行 C# 代码。

    您需要创建一个新的 ModuleDataSource (https://2sxc.org/en/Docs/Feature/feature/4542) 对象并告诉它它来自模块 1。如果您从未这样做过,基本上您的代码可以像可视化设计器一样创建查询,但是您拥有更多控制权 - 请参阅 wiki https://github.com/2sic/2sxc/wiki/DotNet-DataSources-All。 visual-query-designer 中的 Module-Data-Source 不允许您“切换”模块(我们将来可能会添加一个高级设置),但该对象有一个 ModuleId 属性,您可以在访问数据之前设置它,使其“切换”到该模块。这是您的 Module#2 剃须刀中的伪代码...

    var otherModData = CreateSource<ModuleDataSource>();
    otherModData.ModuleId = 1;
    
    foreach(var itm in AsDynamic(otherModData["Default"])) {
        ...
    }
    

    应该这样做:)

    【讨论】:

    • 创建一个具有特定 ModuleId 的新 ModuleDataSource 正是我想要的,它现在显示原始模块中的所有项目。非常感谢您的详细回答。
    • 虽然 (add/edit/..) 工具栏现在在第二个(不是原始)模块上的每个项目上都可见,但似乎所有按钮操作都针对此模块的数据源 (不是代码中具有该 id 的原始项目),因此添加一个新项目会将其添加到此模块数据源中并且将不再可见,删除、编辑等也是如此。有什么方法可以确保这些操作的目标是“mainModuleDS”(具有特定 ID 的模块的数据源)?
    • @using ToSic.SexyContent.DataSources; @{ var mainModuleDS = CreateSource(); mainModuleDS.ModuleId = 562; } @foreach(AsDynamic 中的var item(mainModuleDS["Default"])) { @Edit.Toolbar(target: item, actions: "new,edit,replace,remove,moveup,movedown,instance-list") }跨度>
    • 当您在模块 2 中时,编辑将应用于模块 2。您可以使用模块 1 中的数据,但这不会改变上下文。如果您真的希望在这两种情况下都具有完全的可编辑性,则需要使用相同的模块并根据 tabid 或其他内容有条件地更改其显示方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2014-09-20
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多