好吧,我现在正在玩强类型的东西。让整个 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() 返回的字符串?
现在 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);