ASP.NET MVC3 Razor Syntax-Hilfe - Ich bin immer in einer Endlosschleife stecken
-
27-09-2019 - |
Frage
Ich versuche, eine kleine MVC2 Anwendung auf die MVC3 Rasierer Syntax zu konvertieren. In meiner MVC2 Anwendung verwende ich die aspx-Ansicht-Engine mit einer Masterseite. Nach dem Beispiel von Steven Sanderson Pro MVC2 Buch 2. Auflage, in der Masterpage nenne ich eine Controller-Aktion, die für jedes Unternehmen eine Teilansicht macht. Dies funktioniert korrekt.
<div id="categories">
<% Html.RenderAction("Menu", "Nav"); %>
</div>
mit _layout.cshtml und gestochen Ich versuche dies. Hier ist, wo mein Problem kommt.
<div id="categories">
@{
Html.RenderAction("Menu", "Nav");
}
</div>
Dies verursacht eine Endlosschleife jetzt, und ich bin immer seltsam genug, um eine Stackoverflow. Kann mir jemand helfen korrigieren Sie mich das Problem? Hier ist der Controller-Methode Code.
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);
}
Jede Hilfe oder Tipps ist am meisten geschätzt.
Danke,
~ Ck in San Diego
Lösung
Sie haben nicht schreiben den tatsächlichen Stack-Trace, aber aus der Beschreibung Ich vermute, Ihre recurssion sind in der ‚partiellen‘ Aktionsansicht, die die Layout-Seite ausgeführt wird, die die Aktion macht, die das Layout macht, etc.
Versuchen Sie, eine PartialView
von Ihrem Kind Aktionsmethode anstelle eines View
zurück. Dies wird die _ViewStart Seite aus wird ausgeführt verhindern, die das Layout verhindern wird von Ihrem Kind Aktion gemacht zu werden. Weitere Diskussion darüber ist hier: http://forums.asp.net/t/1624687.aspx
Andere Tipps
put
@{
Layout = string.Empty;
}
in oben auf Ihrer Teil-Ansicht.
allererst Ihre PersonId Parameter wird nie verwendet (es ist richtig sowieso geroutet)?
, aber ich würde auf jeden Fall von der Suche in dem EnumerableHelpers.MakeLinks starten es ist der beste Ort für eine Rekursion Problem zu verbergen versuchen, einen Haltepunkt Einstellung dort
, weil von dem, was ich verwenden,
Modell:
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; }
}
}
Ansicht
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; }
}
}
Controller
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);
}
gemacht
TextcontrollerPerson
actionPerson Zuhause
controllerPerson
actionPerson
personId1 carley
controllerPerson
actionPerson
personId2 Kennzeichen
Versuchen Sie, nur diese (anstelle von Render)
tun@Html.Action("Menu", "Nav")
Was ist in Ihrem Menü Ansicht? Gibt es etwas, was zu einer Rekursion werden könnte?