从控制器渲染部分视图
本文关键字:视图 染部 控制器 | 更新日期: 2023-09-27 18:06:40
我有一个控制器ItemsController
,它有一个实例方法GetRecent()
,它返回IQueryable<Item>
在我的应用程序的索引页中,我想使用ItemsController.GetRecent()
的结果呈现部分视图_Recent.cshtml
为此,我在Index.cshtml
中编写了以下代码我在~/Views/web中添加了命名空间引用。所以我不需要写出控制器的完整命名空间
@{
ViewBag.ItemsController = new ItemsController();
}
...
@Html.Partial("~/Views/Items/_Recent.cshtml",
((ItemsController)ViewBag.ItemsController).GetRecentItems())
我想直接传递new ItemsController().GetRecentItems()
或将GetRecentItems()
变成静态方法,但我不确定这应该采取什么方向。
我想知道这是否是从控制器构建部分视图的一种可接受的方式,如果不是,如何更有效地完成这一点?
RenderAction
第一个选项是Html.Action
或Html.RenderAction
(有什么区别?)。这些都是ASP的一部分。. Net MVC框架,并提供一种更完善的方法来实现类似于您的代码示例的东西。
使用这种方法,您的视图调用适当的控制器,该控制器获取所需的任何数据,呈现部分视图,并返回它。
我倾向于避免使用这种方法,因为它似乎是向后的,即视图"知道"相当多关于控制器和控制器结构,并且正在积极执行而不仅仅是消费。
这仍然是一个合理的选择。
重塑
您可以将"最近的项目"与主视图的视图模型一起传递。这需要更多的建模工作,但"纯粹"是因为视图与控制器的耦合更少。您的部分视图不需要更改。
异步呈现
您可以使用对适当控制器的AJAX调用呈现最近的项,并让该控制器返回部分视图作为其结果。这可能是最费力的,但是很优雅,因为一些工作被延迟到页面的其余部分被呈现(可能允许延迟加载,和/或改进页面加载时间)。
如果做得正确,这种方法还允许适当的关注点分离。
- 相关问题(不相同,因为它不专注于将数据传递给部分视图)