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

Dotnetnuke 如何强制同一应用程序的两个实例(DNN/2sxc)从同一个流中读取?,dotnetnuke,2sxc,Dotnetnuke,2sxc,抱歉,如果我的问题很傻,但我是DNN/2sxc的新手,我花了一整天的时间试图解决这个问题,但没有成功 我有两个相同应用的实例,一个在主页上,另一个在自己的页面上,每个都必须有自己的视图模板(我使用Razor) 我的问题是,我无法找到一种方法使两个应用程序读取相同的数据,因此其中一个应用程序中的每个添加/编辑/删除/重新排序都会反映到另一个应用程序中,目前每个应用程序都有自己的数据,因此在我的情况下它们不可用 我曾尝试在“数据查询”中使用“EntityTypeFilter”,并在两个视图中使用它(

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

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

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

我曾尝试在“数据查询”中使用“EntityTypeFilter”,并在两个视图中使用它(如在新闻简单演示视频中),它有效地为我提供了两个视图中的所有项目,但此解决方案还带来了另外两个问题:

1-现在我无法使用工具栏(添加/删除/重新排序等)任何项目,如您所见,这对我来说是一个阻碍

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

@foreach(var item in AsDynamic(Data["Default"]))
{
...
@Edit.Toolbar(target: item, actions: "new,edit,replace,remove,moveup,movedown,instance-list")
2.“内容演示项”在列表中也可见,但它并不重要,因为我可以删除它并将其中一个真实数据项用作演示项

我感谢任何帮助。
谢谢。

因此,您应该知道的第一件事是将内容项用作数据(用于查询等)和将其用作指定项(其中每个模块实例都有一个子集)时的区别。以下是有助于您理解差异的博客:

因此,当您想要“手动且轻松地控制显示的确切项目及其顺序等”时,您需要使用“分配给实例的内容”,它还提供简单的添加、删除按钮,因为这些按钮实际上并不删除任何内容,而只是从模块实例中删除分配

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

相同视图

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

不同的视图

如果它是一个不同的视图(可能更紧凑,等等),你同样有多个选择。第一种方法是使用dnn功能进行镜像/复制,只需在该页面上放置一个if im,然后以不同方式显示或插入另一个CSS。如果没有任何开发人员的专业知识,这可能是最简单的

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

您需要创建一个新的ModuleDataSource()对象,并告诉它它来自模块1。如果您从未这样做过,那么基本上您的代码可以像可视化设计器一样创建查询,但是您有更多的控制权-请参阅wiki。VisualQueryDesigner中的模块数据源不允许您“切换”模块(我们将来可能会添加一个高级设置),但对象具有一个ModuleId属性,您可以在访问数据之前设置该属性,使其“切换”到该模块。这是模块#2 razor中的伪代码

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

foreach(var itm in AsDynamic(otherModData["Default"])) {
    ...
}
var otherModData=CreateSource();
otherModData.ModuleId=1;
foreach(AsDynamic中的var-itm(otherModData[“Default”])){
...
}

这应该可以做到:)

使用特定的ModuleId创建一个新的ModuleDataSource正是我所要寻找的,它现在显示了原始模块中的所有项目。非常感谢您提供了详细的答案。虽然(添加/编辑/)工具栏现在在第二个(而不是原始)模块的每个项目上都可见,但似乎所有按钮操作都针对此模块的数据源(而不是代码中具有该id的原始模块),因此,添加新项会将其添加到此模块数据源,并且不再可见,删除、编辑等也是如此。。是否有办法确保操作的目标是“mainModuleDS”(具有特定id的模块的数据源)?@使用ToSic.SexyContent.DataSources;@{var mainModuleDS=CreateSource();mainModuleDS.ModuleId=562;}@foreach(AsDynamic(mainModuleDS[“Default”]){@Edit.Toolbar(目标:项,操作:“新建、编辑、替换、删除、上移、下移、实例列表”)}当您在模块2中时,编辑将应用于模块2。您可以使用模块1中的数据,但这不会更改上下文。如果您真的想在这两种情况下都具有完全的可编辑性,则需要使用相同的模块,并根据tabid或其他内容有条件地更改其显示方式。