如何使用 ASP.net MVC 实现动态面包屑?
如何使用 ASP.net MVC 实现动态面包屑?
如果您对面包屑是什么感到好奇:
什么是面包屑? 好吧,如果您曾经浏览过在线商店或阅读过论坛中的帖子,您可能遇到过面包屑。 它们提供了一种简单的方法来查看您在网站上的位置。 Craigslist 等网站使用面包屑来描述用户的位置。 每个页面上的列表上方是如下所示的内容:
SF Bayarea craigslist > 旧金山市> 自行车
编辑
我意识到 SiteMapProvider 可以实现什么。 我还知道网上有一些提供程序可以让您将站点节点映射到控制器和操作。
但是,当您希望面包屑的文本匹配某些动态值时该怎么办,如下所示:
首页 > 产品展示> 汽车> 丰田
首页 > 产品展示> 汽车> 雪佛兰
首页 > 产品展示> 执行设备> 电椅
首页 > 产品展示> 执行设备> 绞刑架
...其中产品类别和产品是数据库中的记录。 一些链接应该静态定义(当然是主页)。
我正在尝试弄清楚如何做到这一点,但我确信有人已经使用 ASP.net MVC 做到了这一点。
How can dynamic breadcrumbs be achieved with ASP.net MVC?
If you are curious about what breadcrumbs are:
What are breadcrumbs? Well, if you have ever browsed an online store or read posts in a forum, you have likely encountered breadcrumbs. They provide an easy way to see where you are on a site. Sites like Craigslist use breadcrumbs to describe the user's location. Above the listings on each page is something that looks like this:
s.f. bayarea craigslist > city of san francisco > bicycles
EDIT
I realize what is possible with the SiteMapProvider. I am also aware of the providers out there on the net that will let you map sitenodes to controllers and actions.
But, what about when you want a breadcrumb's text to match some dynamic value, like this:
Home > Products > Cars > Toyota
Home > Products > Cars > Chevy
Home > Products > Execution Equipment > Electric Chair
Home > Products > Execution Equipment > Gallows
... where the product categories and the products are records from a database. Some links should be defined statically (Home for sure).
I am trying to figure out how to do this, but I'm sure someone has already done this with ASP.net MVC.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
站点地图绝对是一种方法...或者,您也可以自己编写一个! (当然只要遵循标准的MVC规则)...我刚刚写了一个,我想我会在这里分享。
希望有人会发现这很有帮助,这正是我在搜索 MVC 面包屑时所寻找的。
Sitemap's are definitely one way to go... alternatively, you can write one yourself! (of course as long as standard MVC rules are followed)... I just wrote one, I figured I would share here.
Hopefully someone will find this helpful, this is exactly what I was looking for when I searched SO for MVC breadcrumbs.
ASP.NET 5(又名 ASP.NET Core),MVC Core 解决方案
在 ASP.NET Core 中,事情得到了进一步优化,因为我们不需要在扩展方法中对标记进行字符串化。
在
~/Extesions/HtmlExtensions.cs
中:~/Extensions/StringExtensions.cs
与下面相同(向下滚动查看 MVC5 版本)。在 razor 视图中,我们不需要
Html.Raw
,因为 Razor 在处理IHtmlContent
时负责转义:ASP.NET 4、MVC 5 解决方案
=== ORIGINAL /下面的旧答案===
(扩展上面 Sean Haddy 的答案)
如果你想让它扩展驱动(保持视图干净),你可以这样做:
在
~/Extesions/HtmlExtensions.cs
:(与MVC5 / bootstrap兼容)
在
~/Extensions/StringExtensions.cs
中:然后像这样使用它(例如在_Layout.cshtml中):
ASP.NET 5 (aka ASP.NET Core), MVC Core Solution
In ASP.NET Core, things are further optimized as we don't need to stringify the markup in the extension method.
In
~/Extesions/HtmlExtensions.cs
:~/Extensions/StringExtensions.cs
remains the same as below (scroll down to see the MVC5 version).In razor view, we don't need
Html.Raw
, as Razor takes care of escaping when dealing withIHtmlContent
:ASP.NET 4, MVC 5 Solution
=== ORIGINAL / OLD ANSWER BELOW ===
(Expanding on Sean Haddy's answer above)
If you want to make it extension-driven (keeping Views clean), you can do something like:
In
~/Extesions/HtmlExtensions.cs
:(compatible with MVC5 / bootstrap)
In
~/Extensions/StringExtensions.cs
:Then use it like (in _Layout.cshtml for example):
codeplex 上有一个工具可以执行此操作: http://mvcsitemap.codeplex.com/ [project < a href="https://github.com/maartenba/MvcSiteMapProvider" rel="nofollow noreferrer">移至 github]
编辑:
有一种方法可以从数据库派生 SiteMapProvider: http://www.asp.net/Learn/data-access/tutorial-62 -cs.aspx
您也许可以修改 mvcsitemap 工具以使用它来获得您想要的内容。
There is a tool to do this on codeplex: http://mvcsitemap.codeplex.com/ [project moved to github]
Edit:
There is a way to derive a SiteMapProvider from a database: http://www.asp.net/Learn/data-access/tutorial-62-cs.aspx
You might be able to modify the mvcsitemap tool to use that to get what you want.
我构建了这个 nuget 包来为自己解决这个问题:
https://www.nuget.org/packages/ MvcBreadCrumbs/
如果您有想法,可以在这里做出贡献:
https://github.com/thelarz/ MvcBreadCrumbs
I built this nuget package to solve this problem for myself:
https://www.nuget.org/packages/MvcBreadCrumbs/
You can contribute here if you have ideas for it:
https://github.com/thelarz/MvcBreadCrumbs
对于那些使用 ASP.NET Core 2.0 并寻找比 vulcan 的 HtmlHelper 更加解耦的方法的人,我建议看看使用 依赖注入。
下面是一个简单的实现,可以轻松地根据您的需求进行调整。
面包屑服务 (
./Services/BreadcrumbService.cs
):在
AddMvc( 之后在
:startup.cs
中注册服务)创建一个部分来渲染面包屑 (
~/Views/Shared/Breadcrumbs.cshtml
):此时,渲染面包屑面包屑只需调用
Html.Partial("Breadcrumbs")
或Html.PartialAsync("Breadcrumbs")
。For those using ASP.NET Core 2.0 and looking for a more decoupled approach than vulcan's HtmlHelper, I recommend having a look at using a partial view with dependency injection.
Below is a simple implementation which can easily be molded to suit your needs.
The breadcrumb service (
./Services/BreadcrumbService.cs
):Register the service in
startup.cs
afterAddMvc()
:Create a partial to render the breadcrumbs (
~/Views/Shared/Breadcrumbs.cshtml
):At this point, to render the breadcrumbs simply call
Html.Partial("Breadcrumbs")
orHtml.PartialAsync("Breadcrumbs")
.Maarten Balliauw 的 MvcSiteMapProvider 对我来说效果很好。
我创建了一个小型 mvc 应用程序来测试他的提供程序:
MvcSiteMapProvider Test(404)Maarten Balliauw's MvcSiteMapProvider worked pretty well for me.
I created a small mvc app to test his provider:
MvcSiteMapProvider Test(404)对于感兴趣的人,我做了一个
HtmlExtension
的改进版本,它也考虑了区域,此外还使用反射来检查区域内是否有默认控制器或控制器内是否有索引操作:绝对可以改进(可能没有涵盖所有可能的情况),但直到现在它并没有让我失望。
For whoever is interested, I did an improved version of a
HtmlExtension
that is also considering Areas and in addition uses Reflection to check if there is a Default controller inside an Area or a Index action inside a Controller:If can definitely can be improved (probably does not cover all the possible cases), but it did not failed me until now.