使用RenderAction()和当前操作时出现问题

时间:2010-11-17 23:57:10

标签: asp.net asp.net-mvc-2 components partial-views renderaction

我正在使用组件架构构建ASP.Net MVC 2应用程序。有两种不同类型的组件:基本组件,它们具有呈现局部视图的关联控制器操作,以及布局组件,它们呈现其所有子组件(基本组件或在某种布局中再次布局。

这是我的通用 RenderComponent()操作方法,它采用组件ID并呈现相应的视图:

[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(5)被调用而不是RenderComponent(1) !!

这显然会导致布局视图呈现自身的无限循环。


为什么会这样?我该如何解决?我的分层组件架构是否与ASP.Net MVC不兼容?你将如何在ASP.Net MVC中构建这样一个系统?

1 个答案:

答案 0 :(得分:0)

好的,我的不好......当然,它必须是VerticalLayout.ascx中的<% Html.RenderAction("RenderComponent", "Core", new { id = child.ID}); %>