2013-12-11 43 views

回答

0

要做到這一點,最好的方法是編輯(或創建另一個)模板來構建規範標籤。如果您使用NuGet軟件包進行安裝,則在/ Views/Shared/DisplayTemplates文件夾中,您將擁有一個CanonicalHelperModel.cshtml文件(如果使用的是Webforms而不是剃鬚刀,則使用.ascx擴展名)。默認情況如下所示:

@model MvcSiteMapProvider.Web.Html.Models.CanonicalHelperModel 
@using System.Web.Mvc.Html 
@using MvcSiteMapProvider.Web.Html.Models 

@if (!String.IsNullOrEmpty(Model.CurrentNode.CanonicalUrl)) { 
    <link rel="canonical" href="@Model.CurrentNode.CanonicalUrl" /> 
} 

如果沒有規範的URL通過添加else塊來解析,您可以更改它以便使用URL屬性。

@model MvcSiteMapProvider.Web.Html.Models.CanonicalHelperModel 
@using System.Web.Mvc.Html 
@using MvcSiteMapProvider.Web.Html.Models 

@if (!String.IsNullOrEmpty(Model.CurrentNode.CanonicalUrl)) { 
    <link rel="canonical" href="@Model.CurrentNode.CanonicalUrl" /> 
} else { 
    <link rel="canonical" href="@string.Format("http://www.mysite.com{0}, Model.CurrentNode.Url)" /> 
} 

您可能需要設計一個更好的方式來獲取基本網址(域名和HTTP/HTTPS),並可靠地與URL屬性串連它,規範標籤需要一個絕對的URL。您可以只抓取當前的Request.RawUrl而不是Model.CurrentNode.Url,但是您需要確保在將其顯示在頁面上之前對其進行了適當的清理(和HTML編碼)以防止XSS攻擊。但是,如果使用Request.RawUrl來獲取基本URL(通過將其加載到Uri對象中,然後使用基本URL部分),則應該沒問題。

這隻適用於在SiteMap中定義了匹配節點的頁面。如果從外部源(如數據庫)讀取節點,應確保數據庫中的每個記錄都在SiteMap中有一個節點,因此存在一對一關聯(至少對於您希望在搜索引擎中編入索引的頁面)。在這種情況下,您不應該使用preservedRouteParameters。有關該主題的更多信息,請參閱How to Make MvcSiteMapProvider Remember a User's Position

在附註上,確實沒有必要去做你所要求的事情,因爲唯一需要規範標籤的頁面是重複的。

相關問題