Domanda

Sto cercando di convertire una piccola applicazione MVC2 alla sintassi MVC3 rasoio. Nella mia applicazione MVC2 sto usando il motore di visualizzazione aspx con una pagina master. Seguendo l'esempio da MVC2 libro 2 ° edizione di Steven Sanderson Pro, nel masterpage che io chiamo un'azione di controllo che rende una visione parziale per ogni entità. Questo funziona correttamente.

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

utilizzando _layout.cshtml e rasoio sto cercando questo. Qui è dove il mio problema entra in gioco.

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

    }
</div>

Questo sta causando un ciclo infinito ora e sto ottenendo stranamente uno StackOverflowException. chiunque aiuto mi può risolvere il problema? Ecco il codice del metodo di controllo.

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

Qualsiasi aiuto o suggerimenti è più apprezzato.

Grazie,
~ Ck a San Diego

È stato utile?

Soluzione

Non hai inviare l'analisi dello stack effettivo, ma dalla descrizione sto cercando di indovinare la vostra recurssion è nella vista 'parziale' azione che esegue il layout di pagina, che rende l'azione, che rende il layout, etc.

Prova restituzione di un PartialView dal tuo metodo di azione del bambino, invece di un View. Questo consentirà di evitare la pagina di _ViewStart da essere giustiziato che impedirà il layout venga reso per la vostra azione bambino. Più discussione su questo è qui: http://forums.asp.net/t/1624687.aspx

Altri suggerimenti

put

@{
    Layout = string.Empty;
} 

in cima alla vostra vista parziale.

prima di tutto il vostro personId parametro non viene mai utilizzato (è indirizzato in modo corretto in ogni caso)?

ma mi sarebbe sicuramente iniziare a guardare negli EnumerableHelpers.MakeLinks è il posto migliore per un problema ricorsione per nascondere provare a impostare un punto di interruzione non

perché da quello che ho usato

Modello:

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

Visualizza

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

Regolatore

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

reso

                                   Testo                                             
controllerPerson
actionPerson                      Casa                                             
controllerPerson
actionPerson
personId1                      Carley                                             
controllerPerson
actionPerson
personId2                      marchio

Prova a fare proprio questo (invece di RenderAction)

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

Qual è secondo lei menù? C'è qualcosa che potrebbe essere la causa di una ricorsione?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top