WebForm有,MVC有沒有
在 WebForm 拜控制項所賜,讓我們可以快速且容易去設置與產出網頁的 SiteMap(中文稱巡覽列、導覽列),不過在 ASP.NET MVC 之下一開始並無控制項觀念,也經常碰到有 WebForm 經驗正在學習 ASP.NET MVC 的新手常問說:WebForm 有什麼控制項的功能,ASP.NET MVC 有沒有。SiteMap 就是常被問到的一項。
說實話,剛接觸 ASP.NET MVC 2 時是比較辛苦,因為沒提供的功能都必須自己手工刻。隨著時間的經過,後來有了 NuGet 的加持直到現在 ASP.NET MVC 4,整個 ASP.NET MVC 上的擴充套件(擴充程式)已經非常完整,今天要介紹的 MvcSiteMapProvider 都一套快速提供 MVC 專案使用的 Sitemap 擴充套件。
安裝與設置MvcSiteMapProvider擴充套件
首先我們先開一個測試用的 MVC - 網際網路專案,然後開啟【套件管理器主控台】:
PM> Install-Package MvcSiteMapProvider安裝之後,會開啟一個 Mvc.sitemap 的檔案,如果讀者看過 Webform 的 SiteMap 設置檔會有相似的感覺。
<?xml version="1.0" encoding="utf-8" ?>
<mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0"
xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0 MvcSiteMapSchema.xsd"
enableLocalization="true">
<mvcSiteMapNode title="Home" controller="Home" action="Index">
<mvcSiteMapNode title="About" controller="Home" action="About"/>
<mvcSiteMapNode title="Contact" controller="Home" action="Contact"/>
</mvcSiteMapNode>
</mvcSiteMap>
<mvcSiteMapNode> 是最主要設定段落,內容很簡單,就是設定 controller 與 action,依各位專案的需求去設計出自己的層次架構即可。例如,我們依 MVC - 網際網路專案去調整為 Home 的 Index 為主節點(程式裡稱 node),Home 的 About 與 Contact 為子節點。這樣我們就完成 MvcSiteMapProvider 的設置。
設置 SiteMap 出現位置
接下來我們必須設置 SiteMap 的出現位置,一般會設置在兩個位置:
- _Layout.cshtml 或 _Layout.vbhtml
進行全網站的設置。 - Views
進行各別頁面的設置。
開啟範例專案的 _Layout.vbhtml 並修改 <div id=body> 的內容:
<div id="body">
@Html.MvcSiteMap().Menu(False, False, True)
目前位置:@Html.MvcSiteMap().SiteMapPath()
@RenderSection("featured", required:=false)
<section class="content-wrapper main-content clear-fix">
@RenderBody()
</section>
</div>
@Html.MvcSiteMap().Menu(False, False, True) 會產生整個網站的連結清單。@Html.MvcSiteMap().SiteMapPath() 會產生麵包屑巡覽(breadcrumbs)。
由產生的 HTML 程式碼來看比較清楚:
<ul id="menu">
<li>
<a href="/">Home</a>
<ul>
<li>
<a href="/Home/About">About</a>
</li>
<li>
<a href="/Home/Contact">Contact</a>
</li>
</ul>
</li>
</ul>
目前位置:<a href="/">Home</a> > About
其他程式碼細部控制請參考MvcSiteMapProvider官方文件。
客製化 MvcSiteMapProvider 範本
如果各位想要客製化 MvcSiteMapProvider 的輸出結果,例如麵包屑巡覽(breadcrumbs)預設是使用 > 符號,但你想改為使用 | 符號或 - 符號,又或者想要修改 <ul id="menu"> 裡的 id 設置,可以到 ~/Shared/DisplayTemplates 之下進行修改,*.ascx 是給 ASPX 引擎使用,*.cshtml 是給 Razor 引擎使用,可依專案類型保留其中一種即可。以修改麵包屑巡覽符號而言,你必須修改 SiteMapTitleHelperModel.cshtml 這支檔案內容。
MvcSiteMapProvider for vbhtml 範本
MvcSiteMapProvider 沒有提供 *.vbhtml,雖然在MVC - VB專案內使用 *.cshtml 不會有任何問題,不過我還是順手給他轉換了一下,以保持專案內容的一致性。
MenuHelperModel.vbhtml
@Modeltype MvcSiteMapProvider.Web.Html.Models.MenuHelperModel
@Imports System.Web.Mvc.Html
@Imports MvcSiteMapProvider.Web.Html.Models
<ul id="menu">
@For Each node In Model.Nodes
@<li>
@Html.DisplayFor(Function(m) node)
@If node.Children.Any() Then
Html.DisplayFor(Function(m) node.Children)
End If
</li>
Next
</ul>
SiteMapHelperModel.vbhtml
@ModelType MvcSiteMapProvider.Web.Html.Models.SiteMapHelperModel
@Imports System.Web.Mvc.Html
@Imports MvcSiteMapProvider.Web.Html.Models
<ul class="sitemap">
@For Each node In Model.Nodes
@<li>
@Html.DisplayFor(Function(m) node)
@If node.Children.Any() Then
Html.DisplayFor(Function(m) node.Children)
End If
</li>
Next
</ul>
SiteMapNodeModel.vbhtml
@ModelType MvcSiteMapProvider.Web.Html.Models.SiteMapNodeModel
@Imports System.Web.Mvc.Html
@Imports MvcSiteMapProvider.Web.Html.Models
@If Model.IsCurrentNode AndAlso Model.SourceMetadata("HtmlHelper").ToString() <> "MvcSiteMapProvider.Web.Html.MenuHelper" Then
@<text>@Model.Title</text>
ElseIf Model.IsClickable Then
@<a href="@Model.Url">@Model.Title</a>
Else
@<text>@Model.Title</text>
End If
SiteMapNodeModelList.vbhtml
@ModelType MvcSiteMapProvider.Web.Html.Models.SiteMapNodeModelList
@Imports System.Web.Mvc.Html
@Imports MvcSiteMapProvider.Web.Html.Models
<ul>
@For Each node In Model
@<li>
@Html.DisplayFor(Function(m) node)
@If node.Children.Any() Then
@Html.DisplayFor(Function(m) node.Children)
End If
</li>
Next
</ul>
SiteMapPathHelperModel.vbhtml
@ModelType MvcSiteMapProvider.Web.Html.Models.SiteMapPathHelperModel
@Imports System.Web.Mvc.Html
@Imports System.Linq
@Imports MvcSiteMapProvider.Web.Html.Models
@For Each node In Model
@Html.DisplayFor(Function(m) node)
@If node IsNot Model.Last() Then
@<text> > </text>
End If
Next
SiteMapTitleHelperModel.vbhtml
@ModelType MvcSiteMapProvider.Web.Html.Models.SiteMapTitleHelperModel @Imports System.Web.Mvc.Html @Imports MvcSiteMapProvider.Web.Html.Models @Model.CurrentNode.Title

您好:
回覆刪除感謝您的教學,想請教這個方法可以提交給google SEO 讓搜尋去做優化嗎?
如果可以詳細應該怎麼做呢?