Как мне вывести идентификатор страницы вместо URL-адреса страницы из поля содержимого 2sxc?

#razor #dotnetnuke #2sxc

#razor #dotnetnuke #2sxc

Вопрос:

У меня есть модуль содержимого 2sxc, который использует C # Razor для шаблона. В моем типе контента у меня есть поле под названием «Ссылка», и этот тип представляет собой ссылку, настроенную так, чтобы пользователь мог выбирать страницу DNN только из выпадающего списка.

Когда пользователь выбирает страницу из выпадающего списка, он помещает что-то вроде «страница: 38», где «38» — это идентификатор вкладки DNN.

В моем шаблоне C # razor я помещаю @Content.Link, и он выводит что-то вроде domain.com/our-services . (our-services — это URL-адрес, связанный с идентификатором вкладки 38).

Я создаю что-то, где я хочу фактически выводить только идентификатор страницы. Поэтому вместо вывода @Content.Link /our-services я хочу, чтобы он выводил идентификатор страницы «38».

Как я могу сделать это в c # razor?

Ответ №1:

Абсолютно. Допустим, ваше поле вызывается Link тогда, как сейчас вы делаете @Content.Link . Это приведет к автоматическому разрешению ссылок.

Если вы не хотите автоматически разрешать, вы должны использовать Content.Get("Link", convertLinks: false) для получения исходной строки, а затем извлечь идентификатор с помощью substring или regex.

Смотрите также 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_

Комментарии:

1. В целях упрощения я использовал пример, в котором поле ссылки является обычным полем. В моих случаях я фактически использую дочерние объекты, поэтому я просматриваю список ссылок в моем модуле содержимого. Я попробовал предложенный вами код, заменив содержимое переменной, используемой в моем цикле дочерних объектов «pathwayItem», но я продолжаю получать сообщение об ошибке «Невозможно выполнить привязку времени выполнения к нулевой ссылке» Есть идеи?

Ответ №2:

@iJungleBoy, я пытался заставить это работать, используя ваш ответ выше, и не смог. Независимо от того, как я использую .Get(), я получаю исключение с нулевой ссылкой. Я нахожусь на 2sxc 11.3; когда был добавлен .Get() ? и, возможно, это было исправлено позже, чем 11.3?

Вот с чем я играю, может быть, вы сможете определить мои ошибки? В приведенном ниже коде .LinkedPages — это поле сущности, которое допускает множественный тип другого типа содержимого с типом поля гиперссылки с именем «Страница»; вы можете увидеть результаты первых 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>
  }
 

Результат без ошибки:

 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 как объект).Get(имя: «Страница», …
  • @pg.Get(имя: «Страница», dontRelyOnParameterOrder: Константы.Параметр RandomProtectionParameter, язык: «en-us», convertLinks: false)

и довольно много других, но всегда выдается ошибка нулевой ссылки, даже если она кажется правильной в соответствии с документами. Мысли?

Для этого варианта / теста @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}Portals02sxcContent_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:Projects2sxc2sxcSrcDnnToSic.Sxc.RazorEnginesRazorRazorEngine.cs:line 67 at 
ToSic.Sxc.Engines.RazorEngine.RenderTemplate() 
in C:Projects2sxc2sxcSrcDnnToSic.Sxc.RazorEnginesRazorRazorEngine.cs:line 77 at 
ToSic.Sxc.Engines.EngineBase.Render() 
in C:Projects2sxc2sxcSrcSxcToSic.SxcEnginesEngineBase.cs:line 150 at 
ToSic.Sxc.Blocks.BlockBuilder.Render() 
in C:Projects2sxc2sxcSrcSxcToSic.SxcBlocksBlockBuilder_Render.cs:line 57
 

Комментарии:

1. Я считаю, что Get, особенно с перегрузкой, которая convertLinks: false является довольно новой. Также была команда (я полагаю, что AsEntity(…).GetBestValue(name, …)` но она устарела, поэтому ее больше нет в документах. Я предлагаю вам обновить.

2. Вы правы, обновление сделало свое дело. Неприятно терять так много времени на эксперименты и репортажи, но я счастлив, что это позади. @pg.Get(name: "Page", convertLinks: false) Теперь возвращает, как ожидалось: page:93