Sitefinity: Как добавить ссылку в шапку из бэкэнда?
Позвольте мне объяснить больше об ориентации страницы.
Used
|_ Forklift
|_ Boomlift
|_ Specs
Каждый раз, когда вы хотите увидеть список погрузчиков, вы переходите в "/ Б / У / Погрузчик". Вы можете увидеть все погрузчики. Может быть несколько моделей с одинаковой грузоподъемностью. Поэтому, когда пользователи нажимают на определенный элемент / погрузчик, они перенаправляются на общую страницу "Используемые / Спецификации /"; Кроме того, мы отправляем 2 дополнительных параметра (жирный в URL). Таким образом, URL выглядит так;
http://localhost:60876/used/specs/used-forklifts/ 2015-hyundai-160d-7a-ls10151
Теперь у нас есть виджет на странице "Спецификации"; с помощью этих двух параметров контроллер виджета вызывает API для получения сведений о грузоподъемнике; на стороне Sitefinity у нас нет никакой модели (ничего в модуле), все сделано скриптами для заполнения деталей погрузчика. Это не проблема, все работает нормально.
Я установил страницу, чтобы не показывать канонический URL, это не показывает это; также хорошо Но как я могу добавить пользовательскую ссылку в голову со стороны сервера? Что-то вроде следующего;
HtmlLink canonicalLink = new HtmlLink();
canonicalLink.Attributes.Add("rel", "canonical");
canonicalLink.Attributes.Add("href", "test");
И у меня есть что-то вроде этого;
Я пробовал так много вещей, ничего не работает. Спасибо за помощь. Моя версия Sitefinity - 10.2.6631.
2 ответа
Вы можете проверить этот пост в блоге, который показывает, как удалить (если существует) и добавить каноническую ссылку в Sitefinity. Вы можете изменить его немного в соответствии с вашими потребностями.
Спасибо @Веселин Васильев за то, что указал мне на решение. Согласно его блогу, здесь приведены все изменения, которые я внес.
В Global.asax
protected void Application_Start(object sender, EventArgs e)
{
SystemManager.ApplicationStart += SystemManager_ApplicationStart;
}
Затем скопировал SystemManager_ApplicationStart из блога;
private void SystemManager_ApplicationStart(object sender, EventArgs e)
{
EventHub.Subscribe<IPagePreRenderCompleteEvent>(evt => PagePreRenderCompleteEvent(evt));
}
Наконец, немного измените PagePreRenderCompleteEvent, чтобы изменить канонический URL;
private void PagePreRenderCompleteEvent(IPagePreRenderCompleteEvent evt)
{
if (!SystemManager.IsDesignMode)
{
var SpecsUrl = "/used/specs";
if (evt.PageSiteNode.Url.Contains(SpecsUrl))
{
try
{
var Page = evt.Page;
var Canonical = (from ctrls in Page.Header.Controls.OfType<HtmlLink>()
where ctrls.Attributes["rel"].Equals("canonical", StringComparison.CurrentCultureIgnoreCase)
select ctrls).FirstOrDefault();
if (Canonical != null)
{
Page.Header.Controls.Remove(Canonical);
}
Canonical = new HtmlLink();
Canonical.Attributes.Add("rel", "canonical");
var Href = evt.PageSiteNode.Url.Replace(SpecsUrl, SystemManager.CurrentHttpContext.Request.Url.PathAndQuery);
// resolve the url as absolute
Href = RouteHelper.ResolveUrl(Href, UrlResolveOptions.Absolute);
Canonical.Href = Href;
Page.Header.Controls.Add(Canonical);
}
catch (Exception e)
{
Log.Write(e);
}
}
}
}