如何强制同一应用程序 (DNN/2sxc) 的两个实例从同一流中读取?

How to force two instance of the same app (DNN/2sxc) to read from the same stream?

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

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

我的问题是我想不出办法让两个应用程序读取相同的数据,所以其中一个应用程序中的每个 add/edit/remove/re-sort 都会反映到另一个应用程序,目前每个应用程序都有自己的数据,因此它们在我的情况下无法使用。

我尝试在 'Data Query' 中使用 'EntityTypeFilter' 并在两个视图中使用它(如在 News-Simple 演示视频中),它有效并为我提供了两种观点,但是这个解决方案带来了另外两个问题:

1- 现在我无法使用工具栏来 (add/remove/reorder,.. 等) 任何项目,正如您在这个 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' 也在列表中可见,但它并不重要,因为我可以将其删除并使用其中一个真实数据项作为演示项。

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

所以你首先应该知道的是将 content-items 用作数据(查询等)和将其用作 assigned-items 的区别(每个 module-instance 都有项的子集)。这是应该可以帮助您了解差异的博客:http://2sxc.org/en/blog/post/12-differences-when-templating-data-instead-of-content

因此,当您想要 "manually and easily control the exact items displayed, their ordering etc." 时,您想要使用 "content-assigned-to-instance",它还为您提供了简单的添加、删除按钮,因为这些按钮并没有真正删除任何内容,只是删除了分配来自 module-instance。

现在你的情况有点特殊,因为你想 re-use 在另一个 module-instance 中完全相同的集合。有几种方法可以做到这一点:

相同视图

如果视图完全相同,只需使用 DNN-features(add-existing-module-to-another 页面)复制模块

不同观点

如果它是不同的视图(可能更紧凑等),您又会有多种选择。第一种是使用 dnn-feature 进行镜像/复制,只需放置一个 if-im-on-this-page-then-show-differently 或注入另一个 CSS。这可能是最简单的,没有任何 dev-know-how.

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

您需要创建一个新的 ModuleDataSource (https://2sxc.org/en/Docs/Feature/feature/4542) object and tell it that it's from Module 1. If you've never done this, it's basically that your code can create a query just like the visual designer, but you have more control - see the wiki https://github.com/2sic/2sxc/wiki/DotNet-DataSources-All。visual-query-designer 中的 Module-Data-Source 不允许您 "switch" 模块(我们可能会使用高级设置将来添加)但是该对象有一个 ModuleId 属性,您可以在访问数据之前设置它,使其 "switch" 到该模块。这是模块#2 剃刀中的伪代码...

var otherModData = CreateSource<ModuleDataSource>();
otherModData.ModuleId = 1;

foreach(var itm in AsDynamic(otherModData["Default"])) {
    ...
}

应该这样做:)