Estoy mirando para agregar el pan rallado a mi sitio web, pero no estoy muy seguro de cómo ir sobre él. He sido capaz de conseguir algo de trabajo básico con el siguiente código:

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

El problema que tengo es que aunque este en realidad no seguimiento de su historia, simplemente se muestra

Home > ControllerName > CurrentItem

por ejemplo,

Home > Members > Greg Dodd

Esto funciona bien cuando ha venido de un miembro de la página de búsqueda, sin embargo, si usted viene de una página diferente, entonces usted pierde aquella historia. ¿Cómo se puede crear una ruta de navegación a través de la Historia en MVC?

Supongo que lo que estoy buscando es algo como:

Home > Controller1 > PreviousItem > ... > CurrentItem

por ejemplo,
Si usted abrió un blog, un blog de elemento, haga clic en el nombre de los autores, sus rutas deben ser:

Home > Blog > SomeBlogTitle > AuthorName

Sin embargo, si usted abre una lista de autores y, a continuación, eligió a un autor en particular, se podría ver el mismo punto de vista representado usando el mismo controlador, pero el pan debe mostrar:

Home > Authors > AuthorName
Has probado a MvcSiteMapProvider?
Yo la miraba, pero no podía ver cómo utilizarlo para hacer lo que yo busco. Yo no puedo asignar cada objeto en una base de datos dinámica. Hay un tutorial que muestra cómo hacerlo?
He actualizado mi respuesta.

OriginalEl autor Greg | 2014-02-01

5 Comentarios

  1. 6

    después de la instalación, que a través de nuget :

    PM> Install-Package MvcSiteMapProvider

    entonces usted puede poner esta línea en su Diseño:

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

    también se puede personalizar para recuperar datos de la base de datos, primero necesita crear una clase que deriva 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();
            }

    a continuación, cambie MvcSiteMap archivo en el proyecto :

    <?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>
    ¿Cómo se trabaja la dinámica de nodo de colección?
    He actualizado mi respuesta.
    Gracias por la actualización, pero aún me falta una pieza del rompecabezas. ¿Qué GetSiteMapData(int)?
    es un método que devuelva una instancia de tipo anónima utilizando select new que necesitamos utilizar en DynamicNode, comprobar la respuesta ahora.
    No funciona para MVC5.

    OriginalEl autor Sirwan Afifi

  2. 6

    He creado un proyecto OSS para resolver el problema por mí mismo. Yo necesitaba más control dinámico de la etiqueta en la ruta:

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

    o, contribuir aquí:

    https://github.com/thelarz/MvcBreadCrumbs

    Por favor no acaba de publicar los enlaces aquí, pero a publicar el código de ayudar a la abridor para resolver su problema.
    Ok, así que el hecho de que escribí toda una solución para el problema instalable en su aplicación con nuget fue simplemente insuficiente. Lo consiguió.
    él se refiere a publicar algunos de los fragmentos de código así.
    Tenga en cuenta que este paquete está bajo la GPL. Esto significa que si usted incluye en su proyecto, también debe de licencia para el resto de su proyecto bajo la licencia GPL.
    Si usted toma su proyecto, esta respuesta queda sin sentido.

    OriginalEl autor Larz

  3. 6

    Si quieres una solución simple que usted puede utilizar este código. Es solo por defecto de configuración de enrutamiento.

    Home /Controlador /Página

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

    OriginalEl autor agenc

  4. 1
    <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>

    Trabajar para usted con bootstrap

    OriginalEl autor Thanhnx

  5. -2

    Para MVC 5 tienes que usar: Instalar el Paquete de MvcSiteMapProvider.MVC5

    OriginalEl autor Abdesselam

Dejar respuesta

Please enter your comment!
Please enter your name here