Я создаю приложение ASP.Net MVC 2 с компонентной архитектурой. Существует два различных типа компонентов: Элементарные компоненты , с которыми связано действие контроллера, представляющее частичное представление, и Компоненты макета , которые отображают все их дочерние компоненты (элементарные компоненты или снова макеты). ) в определенном макете.
Вот мой общий RenderComponent () метод действия, который принимает идентификатор компонента и отображает соответствующее представление:
[ChildActionOnly]
public ActionResult RenderComponent(int id)
{
ComponentRepository repository = new ComponentRepository();
Component component = repository.GetComponent(id);
if (component.ControllerName != null && component.ViewName != null)
{
// render elementary component
return PartialView("Elementary", component);
}
else
{
// render layout
return PartialView(component.Layout.ViewName, component);
}
}
Elementary.ascx отображает элементарный компонент:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyApp.Models.Component>" %>
<% Html.RenderAction(Model.ViewName, Model.ControllerName); %>
В настоящее время единственным существующим макетом является VerticalLayout.ascx :
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyApp.Models.Component>" %>
<%
foreach (var child in Model.ChildComponents()) {
%>
<div class="layout-container">
<% Html.RenderAction("RenderComponent", "Core", child.ID); %>
</div>
<%
}
%>
Проблема:
Когда я пытался отобразить примерный макет компонента с тремя связанными элементарными дочерними компонентами, страница не отображалась. Некоторая отладка выявила следующую проблему:
RenderComponent(5)
отображает макет.
Для рендеринга первого дочернего компонента в макете вызывается Html.RenderAction("RenderComponent", "Core", 1)
в представлении. Шагнув дальше, я обнаружил, что вместо RenderComponent(1)
!!
вызывается
RenderComponent(5)
Это, очевидно, приводит к бесконечному циклу рендеринга самого макета.
Почему это происходит? Как я могу это исправить? Является ли моя иерархическая компонентная архитектура несовместимой с ASP.Net MVC? Как бы вы построили такую систему в ASP.Net MVC?