2sxc v10.20+后如何访问另一个模块的内容和演示项目

问题描述

这是通过 2sxc 10.9.1 运行的代码。尽管我能够获取 TabID、ModuleID 的 CmsBlock 并将其获取到 .Render(),但我还需要更多。这是旧代码。不确定它有什么区别,但此视图使用的是普通的链接内容类型,并且在旧版本的内容应用程序 (appx 3.03=ish) 中运行。 2sxc 已经升级,现在是 11.22.0 LTS。

删除了不必要的东西,所以我怀疑这会按原样运行...

@using ToSic.Razor.Blade
@using ToSic.SexyContent.Environment.Dnn7

@{
  var Helpers = CreateInstance("_Helpers.cshtml");

  // display the items from the Manage Links module,we go in 'sideways'
  // this gives us just the Content items with their Presentations settings,etc.
  var sxci = Factory.SxcInstanceForModule(3360,606); // ModuleID of Manage Links
  var dyn = Factory.CodingHelpers(sxci);
  var allLinks = dyn.AsDynamic(dyn.Data["Default"]); 
}

@* other stuff *@

<div class="row co-documents justify-content-center align-items-center">
  @foreach (var linkItem in allLinks) {
    var linkInfo = Helpers.LinkInfos(linkItem.Link,linkItem.Window,linkItem.Icon);
    string iconStyle = linkItem.IconStyle ?? "fas";
    int linkColumns = (int)linkItem.Presentation.Columns;
    string linkIconAlign = linkItem.Presentation.IconAlign;
    string linkIconBGColor = linkItem.Presentation.IconBGColor;

@* other stuff *@

  }
</div>

因此,最容易弄清楚的是如何将模块作为 CmsBlock 获取,我可以按原样 Render()(如下),但我需要做的是正确访问内容项目列表及其演示数据(如上所示,allLinks)。

ToSic.Sxc.Dnn.Factory.CmsBlock(606,3360).Render();

我错过了什么?我怎样才能像以前一样访问其他模块的数据?在这种情况下,我在网站上的 3 个不同位置执行此操作。所以为了用英语概述这一点,我有一个模块,客户端管理一些特殊链接,这些链接显示在 MegaMenus、其他特殊导航和直接在几个页面上。在每个地方,它们呈现不同。在他们被编辑的“home”模块中,他们看起来很无聊:

enter image description here

我意识到它是这样的:

var allLinks = something1.AsList(something2.Data["Default"]);

我知道 something2一个应用实例,但如何在另一个模块的上下文中创建它?

现在的 something1 是什么?以及如何实例化它?看起来像一个 new ToSic.Sxc.Code.DynamicCode(),但我不知道如何以我可以使用或不只是抛出错误的方式构造它。

提前感谢您的任何见解!

解决方法

好的,需要进行一些测试、反复试验。而且我也错过了 DynamicCode() 是 Factory 类的方法。现在回想起来似乎很容易。

所以首先你要获得 BlockBuilder

  var block = Factory.CmsBlock(606,3360);

然后你从中得到 DynamicCode 实例 (Code.DnnDynamicCodeRoot)

var dc = Factory.DynamicCode(block);

然后一切正常

var allLinks = AsList(dc.Data["Default"]);

其余的代码像以前一样工作;我可以通过 Header(从 ListContent 重命名)和 Presentation(现在是 Content.Presentation)的链接按预期工作。

,

如果您在 2sxc 视图的 C# Razor 模板中,则上述答案可以正常工作。但是,如果您在外面,例如在 DDR 菜单的 Razor 模板中呢?

与上述相同的两个步骤(获取块和 dc),但是您无权访问 AsList() 或应用程序。幸运的是,您已经拥有 DynamicCode,因此您可以像这样获取参考书目内容类型中的所有记录:

<ul>
var items = dc.AsList(dc.App.Data["Bibliography"]);
foreach (var item in items) 
{
  <li>@item.EntityTitle</li>
}
</ul>

因此,一旦您拥有了 dc,您就可以使用所有常见的 2sxc 玩具。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...