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

时间:2017-02-20 16:30:06

标签: dotnetnuke 2sxc

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

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

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

我试图在'数据查询'中使用'EntityTypeFilter'并在两个视图中使用它(如在新闻 - 简单演示视频中),它工作并给了我两个视图中的所有项目,但是这个解决方案还有两个问题:

1-现在我无法使用工具栏(添加/删除/重新排序,等等)任何项目,正如您在此image中看到的那样,这是一个显示停止我,

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

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

2-“内容演示项目”在列表中也可见,但它并不重要,因为我可以将其删除并使用其中一个真实数据项作为演示项目。

我感谢任何帮助。 谢谢。

1 个答案:

答案 0 :(得分:1)

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

因此,当您想要“手动轻松控制显示的确切项目,订购等”时你想使用“内容分配到实例”,这也为你提供了简单的添加,删除按钮,因为这些按钮并没有真正删除任何内容,只是从模块实例中删除了分配。

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

相同观点

如果它是完全相同的视图等,只需使用DNN功能复制模块(add-existing-module-to-another page)

不同观点

如果它是一个不同的视图(可能更紧凑等),你再次有多个选项。第一种是使用dnn-feature进行镜像/复制,只需将if-im-on-this-pages-then-show-different置于不同的位置或注入另一个CSS。没有任何专门知识,这可能是最简单的。

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

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

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

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

应该这样做:)