如何使用ASP.net MVC实现动态面包屑?
如果你对面包屑是什么感到好奇:
什么是面包屑?好吧,如果您曾浏览过在线商店或在论坛中阅读帖子,您可能会遇到面包屑.它们提供了一种查看网站位置的简便方法.像Craigslist这样的网站使用面包屑来描述用户的位置.每页上面的列表上方都是这样的:
sf bayarea craigslist>旧金山市>自行车
我意识到SiteMapProvider可以实现的功能.我也知道网上的提供商可以让你将sitenodes映射到控制器和动作.
但是,当你想要一个breadcrumb的文本匹配一些动态值时,如下所示:
首页>产品>汽车>丰田
首页>产品>汽车>雪佛兰
首页>产品>执行器材>电动椅
主页>产品>执行设备>绞架
...产品类别和产品是数据库中的记录.应该静态定义一些链接(Home肯定).
我想弄清楚如何做到这一点,但我确信有人已经用ASP.net MVC完成了这个.
站点地图绝对是一种方式......或者,你可以自己写一个!(当然只要遵循标准的MVC规则)......我只写了一个,我想我会在这里分享.
@Html.ActionLink("Home", "Index", "Home") @if(ViewContext.RouteData.Values["controller"].ToString() != "Home") { @:> @Html.ActionLink(ViewContext.RouteData.Values["controller"].ToString(), "Index", ViewContext.RouteData.Values["controller"].ToString()) } @if(ViewContext.RouteData.Values["action"].ToString() != "Index"){ @:> @Html.ActionLink(ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString()) }
希望有人会觉得这很有帮助,这正是我在寻找MVC面包屑时所寻找的.
在ASP.NET Core中,事情进一步优化,因为我们不需要在扩展方法中对标记进行字符串化.
在~/Extesions/HtmlExtensions.cs
:
using System.Text.RegularExpressions; using Microsoft.AspNetCore.Html; using Microsoft.AspNetCore.Mvc.Rendering; namespace YourProjectNamespace.Extensions { public static class HtmlExtensions { private static readonly HtmlContentBuilder _emptyBuilder = new HtmlContentBuilder(); public static IHtmlContent BuildBreadcrumbNavigation(this IHtmlHelper helper) { if (helper.ViewContext.RouteData.Values["controller"].ToString() == "Home" || helper.ViewContext.RouteData.Values["controller"].ToString() == "Account") { return _emptyBuilder; } string controllerName = helper.ViewContext.RouteData.Values["controller"].ToString(); string actionName = helper.ViewContext.RouteData.Values["action"].ToString(); var breadcrumb = new HtmlContentBuilder() .AppendHtml(""); } } }
- ") .AppendHtml(helper.ActionLink("Home", "Index", "Home")) .AppendHtml("
- ") .AppendHtml(helper.ActionLink(controllerName.Titleize(), "Index", controllerName)) .AppendHtml("
"); if (helper.ViewContext.RouteData.Values["action"].ToString() != "Index") { breadcrumb.AppendHtml("- ") .AppendHtml(helper.ActionLink(actionName.Titleize(), actionName, controllerName)) .AppendHtml("
"); } return breadcrumb.AppendHtml("
~/Extensions/StringExtensions.cs
保持不变如下(向下滚动以查看MVC5版本).
在剃刀视图中,我们不需要Html.Raw
,因为Razor在处理时会处理转义IHtmlContent
:
.... ....@Html.BuildBreadcrumbNavigation() @RenderBody()
... ...ASP.NET 4,MVC 5解决方案
===下面的原始/旧答案===
(扩展Sean Haddy的答案)
如果你想让它扩展驱动(保持视图干净),你可以做类似的事情:
在
~/Extesions/HtmlExtensions.cs
:(与MVC5/bootstrap兼容)
using System.Text; using System.Web.Mvc; using System.Web.Mvc.Html; namespace YourProjectNamespace.Extensions { public static class HtmlExtensions { public static string BuildBreadcrumbNavigation(this HtmlHelper helper) { // optional condition: I didn't wanted it to show on home and account controller if (helper.ViewContext.RouteData.Values["controller"].ToString() == "Home" || helper.ViewContext.RouteData.Values["controller"].ToString() == "Account") { return string.Empty; } StringBuilder breadcrumb = new StringBuilder("").ToString(); } } }
- ").Append(helper.ActionLink("Home", "Index", "Home").ToHtmlString()).Append("
"); breadcrumb.Append("- "); breadcrumb.Append(helper.ActionLink(helper.ViewContext.RouteData.Values["controller"].ToString().Titleize(), "Index", helper.ViewContext.RouteData.Values["controller"].ToString())); breadcrumb.Append("
"); if (helper.ViewContext.RouteData.Values["action"].ToString() != "Index") { breadcrumb.Append("- "); breadcrumb.Append(helper.ActionLink(helper.ViewContext.RouteData.Values["action"].ToString().Titleize(), helper.ViewContext.RouteData.Values["action"].ToString(), helper.ViewContext.RouteData.Values["controller"].ToString())); breadcrumb.Append("
"); } return breadcrumb.Append("在
~/Extensions/StringExtensions.cs
:using System.Globalization; using System.Text.RegularExpressions; namespace YourProjectNamespace.Extensions { public static class StringExtensions { public static string Titleize(this string text) { return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(text).ToSentenceCase(); } public static string ToSentenceCase(this string str) { return Regex.Replace(str, "[a-z][A-Z]", m => m.Value[0] + " " + char.ToLower(m.Value[1])); } } }然后使用它(例如在_Layout.cshtml中):
.... ....@Html.Raw(Html.BuildBreadcrumbNavigation()) @RenderBody()
... ...
3> ICodeForCoff..:有一个工具可以在codeplex上执行此操作:http://mvcsitemap.codeplex.com/ [project moved to github]
编辑:
有一种方法可以从数据库派生SiteMapProvider:http: //www.asp.net/Learn/data-access/tutorial-62-cs.aspx
您可以修改mvcsitemap工具以使用它来获得所需内容.
推荐阅读
如何解决《如何在Windows上从命令行启动MingW控制台(GitBash)?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《socket.send()和socket.sendall()有什么区别?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《如何将TypeScriptWebPackts-loader与Angular2@View样式集成?》经验,为你挑选了0个好方法。 ... [详细] 如何解决《为什么基于排名的推荐使用NDCG?》经验,为你挑选了0个好方法。 ... [详细] 如何解决《点按时,UniversalLinks不会将用户重定向到我的应用》经验,为你挑选了1个好方法。 ... [详细] 如何解决《将功能参数识别为输入或输出》经验,为你挑选了1个好方法。 ... [详细] 如何解决《如何为QTableWidget创建过滤器?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《如何正确导入Wand到python?》经验,为你挑选了0个好方法。 ... [详细] 如何解决《如何在ViewController中为UIButton创建事件?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《webpackumdlib和外部文件》经验,为你挑选了1个好方法。 ... [详细] 如何解决《PHP:重新加载时重置会话生存期》经验,为你挑选了1个好方法。 ... [详细] 如何解决《是否有可能在另一个请求中有一个Angularjs$http请求?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《C#任务未完成(命令提示符中没有结果)》经验,为你挑选了1个好方法。 ... [详细] 如何解决《Android数据绑定后备/默认值》经验,为你挑选了2个好方法。 ... [详细] 如何解决《VisualStudio2015挂起然后:'XamarinIOSPackage'包未正确加载》经验,为你挑选了1个好方法。 ... [详细] 如何解决《位置固定100父母》经验,为你挑选了2个好方法。 ... [详细] 如何解决《新ASP.NETMVC6标识中AspNetUsers表中ConcurrencyStamp列的用途是什么?》经验,为你挑选了3个好方法。 ... [详细] 如何解决《Array.create和锯齿状数组》经验,为你挑选了1个好方法。 ... [详细] 吐了个 "CAO" !Tags | 热门标签RankList | 热门文章
- 1docker组合中'image'和'build'之间的区别
- 2Android 6.0.1上的Spinner内部填充更大
- 3如何在Python中将浮点数舍入到最接近的整数
- 4在换行符和逗号上拆分字符串
- 5使用Ninject获取实例
- 6如何在UWP App中编码/解码url字符串
- 7如何在Visual Studio代码中注释多行?
- 8如何使用spark sc.textFile获取文件名?
- 9CNAME到s3斗亚马逊
- 10OpenCV鱼眼校准会削减过多的图像
- 11Polymer 1.2 FIREBASE WARNING:用户回调抛出了异常
- 12SQL Server备份文件过度增长
- 13Python:itertools.product()的更快替代方案?
- 14从调用方法并行执行方法
- 15IndexError:索引10000超出了轴0的大小为10000的范围
- 16Java 8函数<String,Void> vs Consumer <String>
- 17Swift_TransportException·无法与主机smtp.sendgrid.net建立连接[连接超时#110]
- 18GIT分支机构如何运作?
- 19如何使用JavaScript操作HTML元素
- 20如何在生产中运行rails console而不执行弹簧?
DevBox开发工具箱 | 专业的在线开发工具网站 京公网安备 11010802040832号 | 京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有