Справка синтаксиса ASP.NET MVC3 Razor - я застрял в бесконечной петле
-
27-09-2019 - |
Вопрос
Я пытаюсь преобразовать небольшое приложение MVC2 в синтаксис бритвы MVC3. В моем приложении MVC2 я использую двигатель View Aspx с главной страницей. В соответствии с примером из Стивена Сандерсона Pro MVC2 Book 2-й редакции в MasterPage я вызываю действие контроллера, которое отображает частичный вид для каждого объекта. Это работает правильно.
<div id="categories">
<% Html.RenderAction("Menu", "Nav"); %>
</div>
Использование _layout.cshtml и бритвы Я пробую это. Вот где приходит моя проблема.
<div id="categories">
@{
Html.RenderAction("Menu", "Nav");
}
</div>
Это вызывает бесконечную петлю сейчас, и я получаю странно достаточно странно стойкости. Кто-нибудь может помочь мне исправить проблему? Вот код метода контроллера.
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);
}
Любая помощь или советы наиболее ценятся.
Спасибо,
~ CK в Сан-Диего
Решение
Вы не опубликовали фактическую трассировку стека, но из описания я предполагаю, что ваш рекурсион находится в «частичном» представлении действий, выполняющий страницу макета, которая отображает действие, которое отображает макет и т. Д.
Попробуйте вернуться PartialView
от вашего метода действия вашего ребенка вместо View
. Отказ Это предотвратит выполнение страницы _viewStart, которая предотвратит оказание макета для вашего дочернего действия. Больше обсуждения об этом здесь: http://forums.ass.SAST/T/1624687.aspx.
Другие советы
помещать
@{
Layout = string.Empty;
}
в верхней части вашего частичного вида.
Прежде всего, ваш Personid Parameter никогда не используется (это все равно правильно маршрутизируется)?
Но я определенно начну с посмотрел в enumerablehelpers.makeLinks. Это лучшее место для проблемы рекурсии, чтобы скрыть попробовать установить точку останова
потому что из того, что я использовал
Модель:
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; }
}
}
Вид
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; }
}
}
Контроллер
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);
}
оказано
ТекстКонтроллерПерсон
ActionPerson Home
КонтроллерПерсон
ActionPerson
Personid1 Carley
КонтроллерПерсон
ActionPerson
Персональный2 Марк
Попробуйте сделать только это (вместо рендерекции)
@Html.Action("Menu", "Nav")
Что такое в вашем меню? Есть что-то, что могло бы вызвать рекурсию?