Sitefinity:如何从后端在 header 中添加 link?
Sitefinity: How to add link in the header from backend?
让我解释一下页面方向。
Used
|_ Forklift
|_ Boomlift
|_ Specs
每次您想查看叉车列表时,请转到“/Used/Forklift”。你可以看到所有的叉车。可能有几台相同型号、相同容量的叉车。因此,当用户单击特定 item/forklift 时,他们将被重定向到公共页面 "Used/Specs/";此外,我们还发送了 2 个附加参数(url 中的粗体参数)。所以 url 看起来像这样;
http://localhost:60876/used/specs/used-forklifts/2015-hyundai-160d-7a-ls10151
现在,我们在 "Specs" 页面上有一个小部件;使用这两个参数小部件控制器调用 API 来获取叉车详细信息;在 Sitefinity 方面,我们没有任何模型(模块中没有任何内容),所有这些都由脚本完成以填充叉车详细信息。这不是问题,一切正常。
我将页面设置为不显示 Canonical url 它不显示;也很好。但是如何从服务器端在头部添加自定义 link 呢?类似于以下内容;
HtmlLink canonicalLink = new HtmlLink();
canonicalLink.Attributes.Add("rel", "canonical");
canonicalLink.Attributes.Add("href", "test");
我有这样的东西;
我试了很多东西都没用。谢谢您的帮助。我的 Sitefinity 版本是 10.2.6631.
您可以查看 this blog post,了解如何在 Sitefinity 中删除(如果存在)和添加规范 link。您可以对其进行一些修改以满足您的需要。
感谢@Veselin Vasilev 指出我的解决方案。根据他的博客,这里是我所做的全部更改。
在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);
}
}
}
}
让我解释一下页面方向。
Used
|_ Forklift
|_ Boomlift
|_ Specs
每次您想查看叉车列表时,请转到“/Used/Forklift”。你可以看到所有的叉车。可能有几台相同型号、相同容量的叉车。因此,当用户单击特定 item/forklift 时,他们将被重定向到公共页面 "Used/Specs/";此外,我们还发送了 2 个附加参数(url 中的粗体参数)。所以 url 看起来像这样;
http://localhost:60876/used/specs/used-forklifts/2015-hyundai-160d-7a-ls10151
现在,我们在 "Specs" 页面上有一个小部件;使用这两个参数小部件控制器调用 API 来获取叉车详细信息;在 Sitefinity 方面,我们没有任何模型(模块中没有任何内容),所有这些都由脚本完成以填充叉车详细信息。这不是问题,一切正常。
我将页面设置为不显示 Canonical url 它不显示;也很好。但是如何从服务器端在头部添加自定义 link 呢?类似于以下内容;
HtmlLink canonicalLink = new HtmlLink();
canonicalLink.Attributes.Add("rel", "canonical");
canonicalLink.Attributes.Add("href", "test");
我有这样的东西;
我试了很多东西都没用。谢谢您的帮助。我的 Sitefinity 版本是 10.2.6631.
您可以查看 this blog post,了解如何在 Sitefinity 中删除(如果存在)和添加规范 link。您可以对其进行一些修改以满足您的需要。
感谢@Veselin Vasilev 指出我的解决方案。根据他的博客,这里是我所做的全部更改。
在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);
}
}
}
}