从控制器渲染部分视图

本文关键字:视图 染部 控制器 | 更新日期: 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.ActionHtml.RenderAction (有什么区别?)。这些都是ASP的一部分。. Net MVC框架,并提供一种更完善的方法来实现类似于您的代码示例的东西。

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

我倾向于避免使用这种方法,因为它似乎是向后的,即视图"知道"相当多关于控制器和控制器结构,并且正在积极执行而不仅仅是消费。

这仍然是一个合理的选择。

重塑

您可以将"最近的项目"与主视图的视图模型一起传递。这需要更多的建模工作,但"纯粹"是因为视图与控制器的耦合更少。您的部分视图不需要更改。

异步呈现

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

如果做得正确,这种方法还允许适当的关注点分离。


  • 相关问题(不相同,因为它不专注于将数据传递给部分视图)