web-dev-qa-db-fra.com

Fil d'ariane dans le site Web C # MVC à l'aide de Bootstrap

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
8
Greg

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>
   }
6
agenc

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:

https://github.com/thelarz/MvcBreadCrumbs

6
Larz

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>
6
Sirwan Afifi
<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

1
Thanhnx