如何从 2sxc 内容字段输出页面 ID 而不是页面 URL?

How do I output the page ID instead of the page URL from a 2sxc Content field?

我有一个使用 C# Razor 作为模板的 2sxc 内容模块。在我的内容类型中,我有一个名为“Link”的字段,类型是 Link,配置为仅允许用户从下拉列表中 select DNN 页面。

当用户从下拉列表中选择一个页面时,它会显示类似“page:38”的内容,其中“38”是 DNN 选项卡 ID。

在我的 C# razor 模板中,我输入了@Content.Link,它会输出类似 domain.com/our-services 的内容。 (我们的服务是与标签 ID 38 关联的 URL)。

我正在构建一些我想实际只输出页面 ID 的东西。因此,我希望它输出页面 ID“38”而不是 @Content.Link 输出 /our-services。

如何在 c# razor 中执行此操作?

当然可以。假设您的字段名为 Link,那么现在您正在做 @Content.Link。这将自动解析链接。

如果不想自动解析,则必须使用Content.Get("Link", convertLinks: false)获取原始字符串,然后用子字符串或正则表达式提取ID。

另见 https://docs.2sxc.org/api/dot-net/ToSic.Sxc.Data.DynamicEntity.html#ToSic_Sxc_Data_DynamicEntity_Get_System_String_System_String_System_String_System_Boolean_

@iJungleBoy,我尝试使用您上面的回答让它工作,但没能成功。无论我如何使用 .Get(),我都会得到空引用异常。我在 2sxc 11.3; .Get() 是什么时候添加的?它可能会在 11.3 之后修复吗?

这是我正在玩的东西,也许你能发现我的错误?在下面的代码中,.LinkedPages 是一个实体字段,它允许多个具有名为“Page”的超链接字段类型的另一个 Content-Type;您可以在下面看到前 3 个的结果。

代码:

  foreach(var pg in pub.LinkedPages)
  {
    <p>Debug: <br>
    <span>    .Page: @pg.Page<br></span>
    <span>Get(name): @pg.Get("Page")<br></span>
    <span>  GetType: @pg.GetType()<br></span>
    <span>Get(name, convertLinks): AsEntity(pg).Get(name: "Page", language: "en", convertLinks: false)</span>
    </p>
  }

结果w/o错误:

Debug:
1.         .Page: https://staging.com/products/fiber-fed-pulsed-plasma-thruster-fppt
2.  .Get("Page"): https://staging.com/products/fiber-fed-pulsed-plasma-thruster-fppt
3.    .GetType(): ToSic.Sxc.Data.DynamicEntity

我也尝试了很多变体,例如:

  • @AsEntity(pg).Get(...)
  • @((pg as object).Get(name: "Page", ...
  • @pg.Get(名称:“页面”,dontRelyOnParameterOrder:Constants.RandomProtectionParameter,语言:“en-us”,convertLinks:false)

和很多其他人,但即使根据文档看起来正确,也总是会出现空引用错误。想法?

为此variation/test @pg.Get(name: "Page", convertLinks: false)

这是完整的错误:

Error: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 
Cannot perform runtime binding on a null reference at CallSite.Target(Closure , CallSite , Object , String , Boolean ) at 
System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2) at 
CallSite.Target(Closure , CallSite , Object , String , Boolean ) at 
System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2) at 
ASP._Page_Portals_0_2sxc_Content__CUA__PubPaper__List__basic_cshtml.Execute() 
in c:\{siteroot}\Portals[=12=]sxc\Content\_CUA\_PubPaper__List--basic.cshtml:line 98 at 
System.Web.WebPages.WebPageBase.ExecutePageHierarchy() at 
System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) at 
ToSic.Sxc.Engines.RazorEngine.Render(TextWriter writer) 
in C:\Projectssxcsxc\Src\Dnn\ToSic.Sxc.Razor\Engines\Razor\RazorEngine.cs:line 67 at 
ToSic.Sxc.Engines.RazorEngine.RenderTemplate() 
in C:\Projectssxcsxc\Src\Dnn\ToSic.Sxc.Razor\Engines\Razor\RazorEngine.cs:line 77 at 
ToSic.Sxc.Engines.EngineBase.Render() 
in C:\Projectssxcsxc\Src\Sxc\ToSic.Sxc\Engines\EngineBase.cs:line 150 at 
ToSic.Sxc.Blocks.BlockBuilder.Render() 
in C:\Projectssxcsxc\Src\Sxc\ToSic.Sxc\Blocks\BlockBuilder_Render.cs:line 57