基于 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);
}
我正在为 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);
}