基于 MvcSiteMapProvider 的 preservedRouteParameters 显示动态面包屑

Show dynamic breadcrumb based on preservedRouteParameters for MvcSiteMapProvider

我正在为 ASP.NET MVC5 项目使用 MvcSiteMapProvider。我想显示一个基于 preservedRouteUrlParamters 的动态面包屑。我有多所大学,每所大学都有课程。我不想列出 mvc.sitemap.

中的所有大学

而不是:

url: /stanford
breadcrumb: home / university

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

它应该看起来像:

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

所以这是模式:

url: /{university}
breadcrumb: home / {university}

url: /{university}/{course}
breadcrumb: home / {university} / course details

这是我的 mvc.sitemap 配置:

<mvcSiteMapNode title="university" controller="Curriculum" action="UniversityDetails" preservedRouteParameters="university">
    <mvcSiteMapNode title="course details" action="CourseDetails" preservedRouteParameters="university,course"/>
</mvcSiteMapNode>

这是我目前的解决方案,但我不确定这是否是一个好方法。

我使用 title="{university}" 并检查模式 {university}

<mvcSiteMapNode title="{university}" controller="Curriculum" action="UniversityDetails" preservedRouteParameters="university">
    <mvcSiteMapNode title="course details" action="CourseDetails" preservedRouteParameters="university,course"/>
</mvcSiteMapNode>

我使用SiteMapNodeModel.Url动态生成面包屑。

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;
}

然后我在SiteMapNodeModel.cshtml显示模板中使用上面的扩展方法。

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

类似于 @Model.Description

有没有更好的方法?

您的方法唯一 错误 是您没有在 URL 中对值进行编码,然后再将其显示在 HTML 中。这意味着某些恶意用户可能会通过操纵 URL.

将 HTML and/or 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); 
}