Проблема с использованием RenderAction () с текущим действием - PullRequest
0 голосов
/ 18 ноября 2010

Я создаю приложение 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?

1 Ответ

0 голосов
/ 19 ноября 2010

ОК, мой плохой ... Конечно, это должно быть <% Html.RenderAction("RenderComponent", "Core", new { id = child.ID}); %> в VerticalLayout.ascx.

...