如何从 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。
@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
我有一个使用 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。
@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