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?
答案 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);
}