如何用ASP.net MVC实现dynamic breadcrumbs?
如果你对面包屑是什么感到好奇:
什么是面包屑?好吧,如果您曾浏览过在线商店或在论坛中阅读帖子,您可能会遇到面包屑 . 它们提供了一种查看网站位置的简便方法 . 像Craigslist这样的网站使用面包屑来描述用户的位置 . 每页上面的列表上面都是这样的:s.f . bayarea craigslist>旧金山市>自行车
编辑
我意识到SiteMapProvider可以实现的功能 . 我也知道网上的提供商可以让你将sitenodes映射到控制器和动作 .
但是,当你想要一个breadcrumb的文本匹配一些动态值时,如下所示:
主页>产品>汽车>丰田首页>产品>汽车>雪佛兰首页>产品> Actuator 材>电动椅首页>产品> Actuator 材>绞架
...产品类别和产品是数据库中的记录 . 应该静态定义一些链接(Home肯定) .
我想弄清楚如何做到这一点,但我确信有人已经用ASP.net MVC完成了这个 .
7 回答
我构建了这个nuget包来为我自己解决这个问题:
https://www.nuget.org/packages/MvcBreadCrumbs/
如果您有想法,可以在这里做出贡献:
https://github.com/thelarz/MvcBreadCrumbs
在codeplex上有一个工具:http://mvcsitemap.codeplex.com/ project [moved to github]
编辑:
有一种方法可以从数据库派生SiteMapProvider:http://www.asp.net/Learn/data-access/tutorial-62-cs.aspx
您可以修改mvcsitemap工具以使用它来获得所需内容 .
站点 Map 绝对是一种方式......或者,你可以自己写一个! (当然只要遵循标准的MVC规则)......我只写了一个,我想我会在这里分享 .
希望有人会觉得这很有帮助,这正是我在寻找MVC面包屑时所寻找的 .
ASP.NET 5(又名ASP.NET Core),MVC核心解决方案
在ASP.NET Core中,事情进一步优化,因为我们不需要在扩展方法中对标记进行字符串化 .
在
~/Extesions/HtmlExtensions.cs
:~/Extensions/StringExtensions.cs
保持与下面相同(向下滚动以查看MVC5版本) .在剃刀视图中,我们不需要
Html.Raw
,因为Razor在处理_1194140时会处理转义:ASP.NET 4,MVC 5解决方案
===下面的原始/旧答案===
(扩展Sean Haddy的答案)
如果你想让它扩展驱动(保持视图干净),你可以做类似的事情:
在
~/Extesions/HtmlExtensions.cs
:(与MVC5 / bootstrap兼容)
在
~/Extensions/StringExtensions.cs
:然后使用它(例如在_Layout.cshtml中):
Maarten Balliauw's MvcSiteMapProvider对我来说效果很好 .
我创建了一个小型mvc应用程序来测试他的提供者:MvcSiteMapProvider Test(404)
对于有兴趣的人,我做了
HtmlExtension
的改进版本,它也在考虑区域,另外使用Reflection来检查区域内是否有默认控制器或控制器内是否有索引操作:如果可以肯定可以改进(可能不包括所有可能的情况),但它直到现在都没有让我失望 .
对于那些使用ASP.NET Core 2.0并寻找比vulcan的HtmlHelper更加分离的方法的人,我建议看一下使用dependency injection的局部视图 .
下面是一个简单的实现,可以很容易地模制,以满足您的需求 .
The breadcrumb service (./Services/BreadcrumbService.cs):
Register the service in startup.cs after AddMvc():
Create a partial to render the breadcrumbs (~/Views/Shared/Breadcrumbs.cshtml):
此时,要渲染面包屑,只需调用
Html.Partial("Breadcrumbs")
或Html.PartialAsync("Breadcrumbs")
.