在 2sxc 强类型中,如何从超链接字段中获取 Int 形式的页面或文件 ID?

问题描述 投票:0回答:1

好吧,我现在正在玩强类型的东西。让整个 shebang 在带有 IntelliSense 的 VS Code 中同时工作,并且能够使用两个字段名称作为属性以及 .Url("PageLink") 等 .RazorTyped 好东西,确实是两个(三个?)世界中最好的。

但是,当您在 2sxc 内容类型中有链接字段(超链接)时,它在内部可以存储“文件:441”或“页面:33”等内容。因此,我错误地认为期望 .Int("PageLink") 返回页面 ID(“33”部分转换为

int
)是合乎逻辑的。但正如你所看到的...

  @foreach (var aPage in pages)
  {
    <pre>
PageLink: @aPage.PageLink
PageLink (url): @aPage.Url("PageLink")
PageLink (get): @aPage.Get("PageLink")
PageLink (int): @aPage.Int("PageLink")
    </pre>
  }

返回:

PageLink: https://pdpr2023.accuraty.us/Parks
PageLink (url): https://pdpr2023.accuraty.us/Parks
PageLink (get): page:34
PageLink (int): 0

请注意,请求 .Int() 会得到零?它只是将“page:34”视为字符串,而不进行任何解析并回退到

int
的默认值 0。

是否有某种方法可以轻松获取 Id,而无需解析或编写方法来处理 .Get() 返回的字符串?

dotnetnuke 2sxc
1个回答
0
投票

现在 2sxc 具有从内容类型生成的强类型类,您可以轻松地将解析(方法)移动到内容类型的类表示。在(2sxc 生成)类上创建您自己的属性!

也许你认为它应该是这样的:

<p>PageLinkId: @aPage.PageLinkId</p>

并返回:

PageLinkId: 34

当然应该是

int
。以下是具体操作方法。请注意,这是使用 2sxc v17.06.03,即 LTS。 因此,从现在开始,这应该是执行此操作的可靠方法。

在您的 2sxc 应用程序文件夹中,现在有一个名为 AppCode/Data 的子文件夹,您将在其中找到适合您的内容类型的 GENERATED .cs 类(您不应修改)。

我的内容类型名为 PagePlus。因此,在该文件夹中我可以看到一个名为

PagePlus.Generated.cs
的文件。我建议您阅读/查看该文件,它有自我文档注释,您将很容易理解发生了什么。您可能还不知道的关键事情是 2sxc 正在主动监视您的内容类型并在保存时(更改时或手动,如果您愿意),*.Generate.cs 文件将重新编译为 DLL...但回到我们正在做什么。我在同一文件夹中添加了自己的名为
PagePlus.cs
的新文件。这不会被覆盖,但会被编译(每次更新时?或者可能不是,在最初创建后,我必须手动编译;在“管理应用程序”、“数据”、“副驾驶”中有一个按钮)。

这是我的新文件 /Portals/0/[MyAppName]/AppCode/Data/PagePlus.cs:

的完整内容
// This is NOT auto-generated, instead, we (Accuraty) are extending the auto-generated class with our own (useful? time-saving?) custom properties and methods.
// See also: https://go.2sxc.org/copilot-data

// App/Edition: [MyAppName]/TBD
// 20240412 JRF

namespace AppCode.Data
{
  public partial class PagePlus
  {
    /// <summary>
    /// PageLinkId as Int<br/>
    /// Returns the value 72 from 'file:72'
    /// </summary>
    public int PageLinkId => Destructure(_item.Get("PageLink").ToString()).Value;

    private (string Name, int Value) Destructure(string pair, char sep = ':')
    {
      string[] parts = pair.Split(sep);
      int number = 0;
      if (parts.Length == 2 && int.TryParse(parts[1], out number))
      {
        return (parts[0], number);
      }
      else
      {
        return ("Invalid pair?", number);
      }
    }

  }

}

这可能没有多大意义,除非您正在做一个大型项目并且需要经常跨多个视图获取该 ID 作为 Int。但我想分享一个例子来展示它现在有多么强大 - 您可以让您的内容类型具有良好命名的属性,并具有内置业务逻辑、常见的省时实用程序以及任何看起来有用的东西。

恕我直言,这将非常令人惊奇(而且有趣)。

另一个有用的补充。看到代码中使用的结果后,我们意识到如果将 .PageLinkId 简单地命名为

.PageId
会更好理解。由于没有冲突,我们将这个额外的单行代码添加到我们的部分类中:

    /// <summary>
    /// PageId as Int<br/>
    /// Returns the value 72 from 'file:72'
    /// </summary>
    public int PageId => PageLinkId;

现在我们的代码更具可读性,这里是 DDR 菜单 Razor 模板的摘录,该模板从名为 PagePlus 的 2sxc 内容类型获取所有 MegaMenu 设置。

@{
  var pages = App.Data.GetAll<PagePlus>();
}

 ...
  <div class="d-flex justify-content-around">
  @foreach (var node in rootChildren)
  {
    var currPage = pages.FirstOrDefault(p => p.PageId == node.TabId);
© www.soinside.com 2019 - 2024. All rights reserved.