#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. Спасибо, я проведу рефакторинг страницы с учетом этого