#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.
Комментарии:
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