Je cherche à ajouter de la chapelure à mon site, mais je ne sais pas trop comment s'y prendre. J'ai pu obtenir quelque chose de base en travaillant avec le code suivant:
<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>
Le problème que j’ai eu, c’est que cela ne retrace pas réellement votre histoire, il vous montre simplement
Home > ControllerName > CurrentItem
par exemple.
Home > Members > Greg Dodd
Cela fonctionne bien lorsque vous venez d'une page de recherche de membres. Toutefois, si vous venez d'une page différente, vous perdez cet historique. Comment créer un fil d'Ariane à l'aide de l'historique dans MVC?
Je suppose que ce que je recherche, c'est quelque chose comme:
Home > Controller1 > PreviousItem > ... > CurrentItem
par exemple, Si vous avez ouvert un blog, puis un élément de blog particulier, puis cliqué sur le nom de l'auteur, votre fil d'Ariane devrait être:
Home > Blog > SomeBlogTitle > AuthorName
Si toutefois vous ouvriez une liste d'auteurs et choisissiez un auteur en particulier, la même vue serait affichée à l'aide du même contrôleur, mais le fil d'Ariane devrait indiquer:
Home > Authors > AuthorName
Si vous voulez une solution simple, vous pouvez utiliser ce code. C'est juste pour la configuration de routage par défaut.
Accueil/Contrôleur/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>
}
J'ai créé un projet OSS pour résoudre le problème par moi-même. J'avais besoin d'un contrôle plus dynamique de l'étiquette dans le fil d'Ariane:
https://www.nuget.org/packages/MvcBreadCrumbs
ou contribuez ici:
après l’installation par nuget:
PM> Install-Package MvcSiteMapProvider
alors vous pouvez mettre cette ligne dans votre mise en page:
@Html.MvcSiteMap().Menu(false, true, true)
vous pouvez également le personnaliser pour extraire les données de la base de données. Vous devez d’abord créer une classe qui dérive de 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();
}
puis changez le fichier MvcSiteMap dans votre projet:
<?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>
Travaille pour toi avec bootstrap