1

我有一个控制器,它有一个返回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()变成静态方法,但是我不确定这应该采取什么方向。

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

4

1 回答 1

2

渲染动作

第一个选项是Html.ActionHtml.RenderAction(有什么区别?。这些是ASP.Net MVC 框架的一部分,并提供了一种更完善的方法来实现与您的代码示例类似的东西。

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

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

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

改造

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

异步渲染

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

如果做得正确,这种方法还可以很好地分离关注点。


  • 相关问题(不完全相同,因为它不专注于将数据传递给局部视图)
于 2013-03-30T08:26:44.860 回答