[英]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()
转换为静态方法的方法,但是我不确定这应该朝什么方向发展。
我想知道这是否是从控制器构建局部视图的公认方法,如果不是,那么如何才能更有效地完成此工作?
第一个选项是Html.Action
或Html.RenderAction
(有什么区别? ) 。 这些是ASP.Net MVC框架的一部分 ,并提供了更完善的方法来实现与您的代码示例类似的内容。
使用这种方法,您的视图将调用适当的控制器,该控制器将获取所有需要的数据,呈现部分视图并返回它。
我倾向于回避使用这种方法,因为它看起来是倒退的,即,视图“知道”了很多关于控制器和控制器结构的信息,并且正在积极地执行而不仅仅是消耗。
不过,这是一个合法的选择。
您可以将“最近项”与主视图的视图模型一起传递。 这需要更多的建模工作,但是“纯粹的”是因为您的视图与控制器的耦合较少。 您的局部视图无需更改。
您可以使用AJAX调用适当的控制器来渲染最近的项目,并让该控制器返回局部视图作为其结果。 这可能是最费力的工作,但是却很优雅,因为某些工作会延迟到页面的其余部分被渲染为止(可能允许延迟加载和/或缩短页面加载时间)。
如果做得正确,这种方法还可以使关注点分离。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.