it-swarm.com.de

Breadcrumbs auf der C # MVC-Website mit Bootstrap

Ich versuche, meiner Site Breadcrumbs hinzuzufügen, aber ich bin nicht ganz sicher, wie ich das machen soll. Ich konnte mit dem folgenden Code etwas Grundlegendes zum Laufen bringen:

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

Das Problem, das ich habe, ist, dass dies Ihre Geschichte nicht aufzeichnet, sondern nur zeigt

Home > ControllerName > CurrentItem

z.B.

Home > Members > Greg Dodd

Dies funktioniert gut, wenn Sie von einer Mitgliedersuchseite kommen. Wenn Sie jedoch von einer anderen Seite kommen, verlieren Sie diesen Verlauf. Wie erstellen Sie einen Breadcrumb-Pfad mithilfe von History in MVC?

Ich schätze, was ich suche, ist ungefähr so:

Home > Controller1 > PreviousItem > ... > CurrentItem

b. Wenn Sie ein Blog geöffnet haben, dann ein bestimmtes Blogelement und dann auf den Namen des Autors geklickt haben, sollten Ihre Breadcrumbs folgendermaßen lauten:

Home > Blog > SomeBlogTitle > AuthorName

Wenn Sie jedoch eine Liste von Autoren geöffnet und dann einen bestimmten Autor ausgewählt haben, wird dieselbe Ansicht mit demselben Controller angezeigt. Die Breadcrumbs sollten jedoch Folgendes anzeigen:

Home > Authors > AuthorName
8
Greg

Wenn Sie eine einfache Lösung wünschen, können Sie diesen Code verwenden. Es ist nur für die Standard-Routing-Konfiguration. 

Home/Controller/Seite

  @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

Ich habe ein OSS-Projekt erstellt, um das Problem für mich selbst zu lösen. Ich brauchte eine dynamischere Kontrolle des Etiketts im Breadcrumb:

https://www.nuget.org/packages/MvcBreadCrumbs

oder hier beitragen:

https://github.com/thelarz/MvcBreadCrumbs

6
Larz

nach dem installieren über nuget:

PM> Install-Package MvcSiteMapProvider

dann können Sie diese Zeile in Ihr Layout einfügen:

@Html.MvcSiteMap().Menu(false, true, true)

sie können es auch anpassen, um Daten aus der Datenbank abzurufen. Zuerst müssen Sie eine Klasse erstellen, die von DynamicNodeProviderBase abgeleitet ist:

   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();
        }

Ändern Sie dann die MvcSiteMap-Datei in Ihrem Projekt:

<?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>

Arbeite für dich mit Bootstrap

1
Thanhnx