我有一个控制器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()
变成静态方法但是我不确定应该采取什么方向。
我想知道这是否是从控制器构建局部视图的可接受方式,如果不是,如何更有效地完成?
答案 0 :(得分:2)
第一个选项是Html.Action
或Html.RenderAction
(What's the difference?)。这些是part of the ASP.Net MVC framework,并提供了一种更精确的方法来实现类似于代码示例的内容。
使用这种方法,您的视图会调用适当的控制器,该控制器将获取所需的所有数据,呈现局部视图并返回它。
我倾向于回避使用这种方法,因为它看起来倒退,即视图“了解”控制器和控制器结构,并且正在积极执行而不仅仅是消费。
不过,这是一个合法的选择。
您可以将“最近的项目”与主视图的视图模型一起传递。这是建模的更多努力,但是“纯粹”,因为您的视图与控制器的耦合较少。您的部分视图无需更改。
您可以使用对相应控制器的AJAX调用来渲染最近的项目,并让该控制器返回部分视图作为其结果。这可能是最省力的,但是优雅的是一些工作被延迟,直到呈现页面的其余部分(可能允许延迟加载和/或改进的页面加载时间)。
如果做得恰当,这种方法也可以让关注点分离。