繁体   English   中英

从控制器渲染局部视图

[英]Render partial view from controller

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

在我的应用程序的索引页面中,我想使用ItemsController.GetRecent()的结果来渲染_Recent.cshtml部分视图。

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

我已经将命名空间引用添加到〜/ Views / web.config中,因此无需写出控制器的完整命名空间

    @{
        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调用适当的控制器来渲染最近的项目,并让该控制器返回局部视图作为其结果。 这可能是最费力的工作,但是却很优雅,因为某些工作会延迟到页面的其余部分被渲染为止(可能允许延迟加载和/或缩短页面加载时间)。

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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM