Show dynamic breadcrumb based on preservedRouteParameters for MvcSiteMapProvider

时间:2016-02-12 20:58:46

标签: asp.net-mvc-5 mvcsitemapprovider

I'm using MvcSiteMapProvider for ASP.NET MVC5 project. I want to show a dynamic breadcrumb based on preservedRouteUrlParamters. I have multiple universities and each university has courses. I don't want to list all the university in the flowLayoutPanel1.Controls.Clear(); .

Instead of:

mvc.sitemap

It should look like:

url: /stanford
breadcrumb: home / university

url: /stanford/course1
breadcrumb: home / university / course details

So this is the pattern:

url: /stanford
breadcrumb: home / stanford

url: /stanford/course1
breadcrumb: home / stanford / course details ...where stanford is link to /stanford

url: /mit
breadcrumb: home / mit

url: /mit/course1
breadcrumb: home / mit / course details ...where mit is link to /mit

Here is the url: /{university} breadcrumb: home / {university} url: /{university}/{course} breadcrumb: home / {university} / course details config I have:

mvc.sitemap

This is solution I have so far but I'm not sure if it is a good way.

I use <mvcSiteMapNode title="university" controller="Curriculum" action="UniversityDetails" preservedRouteParameters="university"> <mvcSiteMapNode title="course details" action="CourseDetails" preservedRouteParameters="university,course"/> </mvcSiteMapNode> and check for the pattern title="{university}".

{university}

I use the <mvcSiteMapNode title="{university}" controller="Curriculum" action="UniversityDetails" preservedRouteParameters="university"> <mvcSiteMapNode title="course details" action="CourseDetails" preservedRouteParameters="university,course"/> </mvcSiteMapNode> to dynamically generate the breadcrumb.

SiteMapNodeModel.Url

I then use the above extension method in the public static string TitleBreadcrumb(this SiteMapNodeModel m) { if (m.Title.StartsWith("{") && m.Title.EndsWith("}")) { return m.Url.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries).Last(); } return m.Title; } display template.

SiteMapNodeModel.cshtml

Similar for // use @Model.TitleBreadcrumb() instead of @Model.Title <a href="@Model.Url">@Model.TitleBreadcrumb()</a> .

Is there a better way?

1 个答案:

答案 0 :(得分:1)

您的方法唯一特别错误的是您在HTML中显示之前没有对URL进行编码。这意味着某些恶意用户可能通过操纵URL将HTML和/或JavaScript注入您的页面。

但是,提供动态标题的最常用方法是使用SiteMapTitleAttribute,它使用模型中的值或ViewData中的值来动态填充标题。

[SiteMapTitle("Name")]
public ViewResult UniversityDetails(string university) { 
   var model = _repository.Find(university);

   // Name is a string property of 
   // the university model object.
   return View(model); 
}

[SiteMapTitle("Name", Target = AttributeTarget.ParentNode)]
public ViewResult CourseDetails(string university) { 
   var model = _repository.Find(university);

   // Name is a string property of 
   // the university model object.
   return View(model); 
}