0

Ich baue eine ASP.Net MVC 2-Anwendung mit einer Komponentenarchitektur. Es gibt zwei verschiedene Arten von Komponenten: Elementary Components, denen eine Controlleraktion zugeordnet ist, die eine Teilansicht darstellt, und Layoutkomponenten, die alle ihre untergeordneten Komponenten (Elementarkomponenten oder Layouts) in einem bestimmten Layout rendern.Problem bei Verwendung von RenderAction() mit der aktuellen Aktion

Hier ist meine allgemeine RenderComponent() Aktionsmethode, die eine Komponente ID nimmt und macht die entsprechende Ansicht:

[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 macht eine elementare Komponente:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyApp.Models.Component>" %> 
<% Html.RenderAction(Model.ViewName, Model.ControllerName); %> 

Derzeit ist das einzige existierende Layout das 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> 
<% 
    } 
%> 

Das Problem:

Als ich versuchte, ein Beispiel Layout-Komponente mit drei zugehörigen elementaren geordneten Komponenten zu machen, die Seite nicht machen würde. Ein Debugging ergab folgendes Problem:

rendert die Layoutansicht. Zum Rendern der ersten untergeordneten Komponente im Layout wird Html.RenderAction("RenderComponent", "Core", 1) in der Ansicht aufgerufen. Als ich weiter ging, entdeckte ich, dass RenderComponent(5) anstelle von RenderComponent(1) aufgerufen wurde !!

Dies führt offensichtlich zu einer Endlosschleife des Renderings der Layoutansicht.


Warum passiert das? Wie kann ich es reparieren? Ist meine hierarchische Komponentenarchitektur mit ASP.Net MVC inkompatibel? Wie würden Sie ein solches System in ASP.Net MVC erstellen?

Antwort

0

OK, mein Fehler ... Natürlich muss es in VerticalLayout.ascx <% Html.RenderAction("RenderComponent", "Core", new { id = child.ID}); %> sein.