当一个Controller的View调用另一个Controller的View时,如何使数据可用?

时间:2010-06-20 12:30:09

标签: c# asp.net-mvc

背景
我正在尝试生成动态生成的Factsheets,其中每个Factsheet都有许多ContentAreas,每个ContentArea都配置为包含许多Panel。

我有一个FactsheetController,一个ContentAreaController,一个PanelController以及各个小组,例如NameAndDate和AssetPanel

FactsheetController生成一个索引视图,作为模板将ContentAreas加载到。

这是FactsheetController的索引,其中Model包含定义哪些面板与哪个ContentArea关联的配置数据:

<div id="divTop"> 
    <% Html.RenderAction("Top", "ContentArea", Model); %>
</div>
<div id="divLeftColumn">
    <% Html.RenderAction("Left", "ContentArea", Model); %>
</div>
<div id="divRightColumn">
    <% Html.RenderAction("Right", "ContentArea", Model); %>
</div>
<div id="divBottom">
    <% Html.RenderAction("Bottom", "ContentArea", Model); %>
</div>

Top上调用ContentAreaController操作方法时,它会将与PanelConfigurations相关联的ContentArea列表传递给其PartialView,该列表已定义为:

<% foreach (ConfiguredFactsheetPanel panel in Model)
   { %>

    <% Html.RenderAction(panel.Name, "Panel", panel); %>

<% } %>

这个PartialView呈现然后渲染它配置为显示的每个面板。

当我加载FactsheetController时,我需要一个Fund对象的实例,以了解哪个ContentAreas与该特定Factsheet相关联,因此我创建了一个QueryStringFund数据上。问题是,我还需要PanelController中的Fund对象,因为QueryString对象包含我需要显示的数据。 PanelController中不存在FactsheetController数据,因为它仅存在于调用Fund的网址中。

问题:
所以我的问题是,对于我在FactsheetController中创建的PanelController对象在{{1}}

中提供的最佳方式是什么?

我也有兴趣听听任何人对这个初步设计问题的意见。

1 个答案:

答案 0 :(得分:0)

我不会使用这样的查询字符串。我将扩展传递给FactsheetController的索引的模型对象,以包含其他部分视图中所需的数据,然后将其传递给使用RenderAction方法的操作。因此,ConfiguredFactsheetPanel将扩展为包含或替换为包含部分视图中所需的Fund对象的类型。

我怀疑您在视图中使用的对象当前是由您的持久性技术(如NHibernate或Entity Framework)驱动的实体。如果是这种情况,您可能不希望更改实体定义以满足您的视图,而是创建视图模型。