Question

Je suis en train de convertir une petite application MVC2 à la syntaxe de rasoir de MVC3. Dans ma demande MVC2 J'utilise le moteur de vue ASPX avec une page maître. Suivant l'exemple de Pro livre MVC2 Steven Sanderson 2e édition, dans le masterpage j'appelle une action de contrôleur qui rend une vue partielle pour chaque entité. Cela fonctionne correctement.

 <div id="categories">
    <% Html.RenderAction("Menu", "Nav"); %>
</div>

à l'aide _layout.cshtml et rasoir J'essaie ça. Voici où vient mon problème.

 <div id="categories">
    @{ 
        Html.RenderAction("Menu", "Nav"); 

    }
</div>

Ce qui provoque une boucle infinie et maintenant je deviens assez curieusement un StackOverflowException. aider quelqu'un peut me corriger le problème? Voici le code de la méthode du contrôleur.

  public ViewResult Menu(string personId)
    {
        Func<string, NavLink> makeLink = pId => new NavLink
        {
            Text = pId ?? "Home"
            , RouteValues = new RouteValueDictionary(new { controller = "Person", action = "Person"})

        };

        List<NavLink> navLinks = new List<NavLink> {makeLink(null)};


        Func<Person, NavLink> makeLink2 = p => new NavLink
        {
            Text = p.Name ?? "Home"
            , RouteValues = new RouteValueDictionary(new { controller = "Person", action = "Person", personId = p.Id })

        };

        var people = usersRepository.People.OrderBy(x => x.Name);
        var peopleLinks = EnumerableHelpers.MakeLinks(people, makeLink2);

        navLinks.AddRange(peopleLinks);

        return View("_menu", navLinks);
    }

Toute aide ou des conseils est le plus apprécié.

Merci,
~ Ck à San Diego

Était-ce utile?

La solution

Vous n'a pas affiché la trace de la pile réelle, mais à partir de la description que je devine votre recurssion est dans la vue d'action « partielle » en cours d'exécution la page de mise en page, ce qui rend l'action, ce qui rend la mise en page, etc.

Essayez un retour PartialView de votre méthode d'action de l'enfant au lieu d'un View. Cela empêchera la page _ViewStart d'être exécuté qui empêchera la mise en page d'être rendu pour votre action enfant. Plus de discussion à ce sujet est ici: http://forums.asp.net/t/1624687.aspx

Autres conseils

mettre

@{
    Layout = string.Empty;
} 

en haut de votre vue partielle.

d'abord votre personId paramètre est jamais utilisé (est-il correctement acheminé de toute façon)?

mais je certainement commencer par regarder dans les EnumerableHelpers.MakeLinks il est le meilleur endroit pour un problème de récursivité pour essayer de cacher la fixation d'un point de jonction

parce que d'après ce que je

Modèle:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MvcApplication1.Controllers
{
    public class Person
    {
    public int Id { get; set; }
    public string Name { get; set; }
}
public class EnumerableHelpers
{

    internal static List<NavLink> MakeLinks(IOrderedEnumerable<Person> people, Func<Person, NavLink> makeLink2)
    {
      var retVal = new List<NavLink>  ();
      foreach (var item in people)
      {
          retVal.Add(makeLink2(item));
      }
      return retVal;
    }
}
public class usersRepository
{
    private static List<Person> people = new List<Person>();
    public usersRepository()
    {


    }
    public static List<Person> People
    {
        get
        {
            people = new List<Person>()  {
                 new Person() { Id = 1,  Name = "carley" },
                 new Person() { Id = 2,  Name = "mark" },
             };
            return people;
        }
        set
        {
            people = value;
        }
    }


}

public class NavLink
{
    public System.Web.Routing.RouteValueDictionary RouteValues { get; set; }
    public string Text { get; set; }
}
}

Voir

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace MvcApplication1.Controllers
    {
        public class Person
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }
        public class EnumerableHelpers
        {

            internal static List<NavLink> MakeLinks(IOrderedEnumerable<Person> people, Func<Person, NavLink> makeLink2)
            {
              var retVal = new List<NavLink>  ();
              foreach (var item in people)
              {
                  retVal.Add(makeLink2(item));
              }
              return retVal;
            }
        }
        public class usersRepository
        {
            private static List<Person> people = new List<Person>();
            public usersRepository()
            {


            }
            public static List<Person> People
            {
                get
                {
                    people = new List<Person>()  {
                         new Person() { Id = 1,  Name = "carley" },
                         new Person() { Id = 2,  Name = "mark" },
                     };
                    return people;
                }
                set
                {
                    people = value;
                }
            }


        }

        public class NavLink
        {
            public System.Web.Routing.RouteValueDictionary RouteValues { get; set; }
            public string Text { get; set; }
        }
    }

Contrôleur

public ViewResult Menu(string id)
     {
        Func<string, NavLink> makeLink = pId => new NavLink
        {
            Text = pId ?? "Home"
            ,
            RouteValues = new RouteValueDictionary(new { controller = "Person", action = "Person" })

        };

        List<NavLink> navLinks = new List<NavLink> { makeLink(null) };


        Func<Person, NavLink> makeLink2 = p => new NavLink
        {
            Text = p.Name ?? "Home"
            ,
            RouteValues = new RouteValueDictionary(new { controller = "Person", action = "Person", personId = p.Id })

        };

        var people = usersRepository.People.OrderBy(x => x.Name);
        var peopleLinks = EnumerableHelpers.MakeLinks(people, makeLink2);

        navLinks.AddRange(peopleLinks);

        return View(navLinks);
    }

rendu

                                   Texte                                             
controllerPerson
actionPerson                      Accueil                                             
controllerPerson
actionPerson
personId1                      Carley                                             
controllerPerson
actionPerson
personId2                      marque

Essayez de faire tout ce (au lieu de RenderAction)

@Html.Action("Menu", "Nav")

Qu'est-ce que dans votre affichage du menu? Y at-il quelque chose qui pourrait être à l'origine d'une récursion?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top