Umbraco — получение содержимого из текста вместо NodeID

#c# #umbraco

#c# #umbraco

Вопрос:

В настоящее время в моем проекте есть следующий код:

 var umbracoHelper = new UmbracoHelper(UmbracoContext.Current);
IPublishedContent currentContent = umbracoHelper.TypedContent(UmbracoContext.Current.PageId);
var contentService = UmbracoContext.Current.Application.Services.ContentService;

int configPageId = 0;

if(currentContent.AncestorsOrSelf().Select(x => x.Id).ToArray().Contains(1309))
{
    configPageId = 1872;
} 
else if(currentContent.AncestorsOrSelf().Select(x => x.Id).ToArray().Contains(1308))
{
    configPageId = 1660;
}
if(configPageId != 0)
{
    IContent content = contentService.GetById(configPageId);
    linkCreditSimulator = content.GetValue("linkCreditSimulator").ToString();
    linkAskNow = content.GetValue("linkAskNow").ToString();
}
 

Я думаю, кто бы это ни сделал, это было связано с разными средами, имеющими разные идентификаторы.

Я надеялся нормализовать это.

Если я выполню следующий запрос:

     SELECT TOP (1000)  d.text
  FROM [cmsContent] c
  LEFT join cmsContentXml cxml on c.nodeId = cxml.nodeId
  LEFT join cmsMedia m on m.nodeId = c.nodeId
  LEFT join cmsDocument d on d.nodeId = c.nodeId
  LEFT join cmsMedia cm on cm.nodeId = c.nodeId
  LEFT join cmsMember mb on mb.nodeId = c.nodeId
  LEFT join cmsPreviewXml p on p.nodeId = c.nodeId
  LEFT join cmsTagRelationship tr on tr.nodeId = c.nodeId
  where c.nodeId = 1872
 

Я получаю значение «Simulator», которое одинаково в разных средах.

Я пытался найти какой-либо метод в ContentService, подобный

 IContent content = contentService.GetByName("Simulator");
 

Но я не смог. Знаете ли вы, есть ли способ добиться этого?
Какой другой подход вы бы порекомендовали?

С наилучшими пожеланиями

Ответ №1:

Предполагая, что «configPage» является определенным типом содержимого, вы можете запросить этот тип, используя его псевдоним: https://our.umbraco.com/documentation/Reference/Querying/UmbracoHelper/#contentatxpathstring-xpath — таким образом, вам нужно только жестко закодировать псевдоним, а не набор идентификаторов, которые, как вы говорите, могут и будут различать среды.

Использование ContentService также должно быть сведено к минимуму, поскольку оно использует доступ к базе данных (например, огромный SQL-запрос в вашем примере) вместо кэша. ContentAtXPath использует кэш.

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

1. Спасибо, я проведу рефакторинг страницы с учетом этого