从控制器渲染局部视图

时间:2013-03-30 08:15:33

标签: c# razor asp.net-mvc-4

我有一个控制器ItemsController,其实例方法GetRecent()返回IQueryable<Item>

在我的应用程序的索引页面中,我想使用_Recent.cshtml

的结果呈现部分视图ItemsController.GetRecent()

为此,我在Index.cshtml中编写了以下内容

我已经在〜/ Views / web.config中添加了命名空间引用,所以我不需要写出控制器的完整命名空间

    @{
        ViewBag.ItemsController = new ItemsController();
    }

    ...

    @Html.Partial("~/Views/Items/_Recent.cshtml",
                   ((ItemsController)ViewBag.ItemsController).GetRecentItems())

我想过直接传递new ItemsController().GetRecentItems()或者将GetRecentItems()变成静态方法但是我不确定应该采取什么方向。

我想知道这是否是从控制器构建局部视图的可接受方式,如果不是,如何更有效地完成?

1 个答案:

答案 0 :(得分:2)

的RenderAction

第一个选项是Html.ActionHtml.RenderAction What's the difference?。这些是part of the ASP.Net MVC framework,并提供了一种更精确的方法来实现类似于代码示例的内容。

使用这种方法,您的视图会调用适当的控制器,该控制器将获取所需的所有数据,呈现局部视图并返回它。

我倾向于回避使用这种方法,因为它看起来倒退,即视图“了解”控制器和控制器结构,并且正在积极执行而不仅仅是消费。

不过,这是一个合法的选择。

重塑

您可以将“最近的项目”与主视图的视图模型一起传递。这是建模的更多努力,但是“纯粹”,因为您的视图与控制器的耦合较少。您的部分视图无需更改。

异步渲染

您可以使用对相应控制器的AJAX调用来渲染最近的项目,并让该控制器返回部分视图作为其结果。这可能是最省力的,但是优雅的是一些工作被延迟,直到呈现页面的其余部分(可能允许延迟加载和/或改进的页面加载时间)。

如果做得恰当,这种方法也可以让关注点分离。


  • Related Question(不完全相同,因为它不专注于将数据传递到局部视图)