I'm looking to add breadcrumbs to my site, but I'm not quite sure how to go about it. I have been able to get something basic working with the following code:
<ol class="breadcrumb">
<li class="active">
@Html.ActionLink("Home", "Index", "Home")
@if (ViewContext.RouteData.Values["controller"] != "Home" && ViewContext.RouteData.Values["action"] != "Index")
{
@:> @Html.ActionLink(ViewContext.RouteData.Values["controller"].ToString(), "Index", ViewContext.RouteData.Values["controller"].ToString())
}
> @ViewBag.SubTitle
</li>
</ol>
The problem I have though is that this doesn't actually track your history, it just shows you
Home > ControllerName > CurrentItem
e.g.
Home > Members > Greg Dodd
This works well when you've come from a member search page, however if you come from a different page then you lose that history. How do you create a breadcrumb trail using History in MVC?
I guess what I'm looking for is something like:
Home > Controller1 > PreviousItem > ... > CurrentItem
e.g. If you opened up a blog, then a particular blog item, then clicked the authors name, your breadcrumbs should be:
Home > Blog > SomeBlogTitle > AuthorName
If however you opened a list of authors and then chose a particular author, you would see the same view rendered using the same controller, but the breadcrumbs should show:
Home > Authors > AuthorName
If you want a simple solution you can use this code. It is just for default routing configuration.
Home / Controller / Page
@if (ViewContext.RouteData.Values["controller"].ToString().ToLower() != "home")
{
<ol class="breadcrumb">
<li>
@Html.ActionLink("Home", "Index", "Home")
</li>
<li> @Html.ActionLink(ViewContext.RouteData.Values["controller"].ToString(), "Index")
</li>
<li class="active"> @Html.ActionLink(ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["action"].ToString())
</li>
</ol>
}
I created an OSS project to solve the problem for myself. I needed more dynamic control of the label in the breadcrumb:
https://www.nuget.org/packages/MvcBreadCrumbs
or, contribute here:
https://github.com/thelarz/MvcBreadCrumbs
after install that via nuget :
PM> Install-Package MvcSiteMapProvider
then you can put this line in your Layout:
@Html.MvcSiteMap().Menu(false, true, true)
also you can customize it to fetch data from data base, first you need create a class that derives from DynamicNodeProviderBase
:
public class PostDetailsDynamicNodeProvider : DynamicNodeProviderBase
{
private readonly IPostService _postService;
public PostDetailsDynamicNodeProvider()
{
_postService = new PostService(new MyDbContext());
}
public override IEnumerable<DynamicNode> GetDynamicNodeCollection()
{
var returnValue = new List<DynamicNode>();
foreach (var post in _postService.GetSiteMapData(20))
{
var node = new DynamicNode
{
Title = post.Title,
Controller = "Post",
Action = "Index",
Area = "",
LastModifiedDate = post.ModifiedDate
};
node.RouteValues.Add("id", post.Id);
node.RouteValues.Add("title", node.Title);
returnValue.Add(node);
}
// Return
return returnValue;
}
}
GetSiteMapData :
public IList<SiteMapModel> GetSiteMapData(int count)
{
return _posts.AsNoTracking().OrderByDescending(post => post.CreatedDate).Take(count).
Select(post => new SiteMapModel
{
Id = post.Id,
CreatedDate = post.CreatedDate,
ModifiedDate = post.ModifiedDate,
Title = post.Title
}).ToList();
}
then change MvcSiteMap file in your project :
<?xml version="1.0" encoding="utf-8" ?>
<mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0"
xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0 MvcSiteMapSchema.xsd"
enableLocalization="true">
<mvcSiteMapNode title="">
<mvcSiteMapNode clickable="true" title="" dynamicNodeProvider="yourCustomClassNamespace" />
</mvcSiteMapNode>
</mvcSiteMap>
<ol class="breadcrumb">
@if (ViewContext.RouteData.Values["controller"].ToString() != "Home")
{
@Html.ActionLink("Home", "Index", "Home")
<li class="active">
/ @ViewBag.Title
</li>
}
else
{
<li class="active">
Home
</li>
}
</ol>
Work for you with bootstrap
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With