C# 从控制器渲染局部视图

C# 从控制器渲染局部视图,c#,razor,asp.net-mvc-4,C#,Razor,Asp.net Mvc 4,我有一个控制器ItemsController,它有一个实例方法GetRecent(),返回IQueryable 在我的应用程序的索引页中,我想使用来自ItemsController.GetRecent()的结果呈现部分视图\u Recent.cshtml 为此,我在Index.cshtml中编写了以下内容 我已将命名空间引用添加到~/Views/web.config,因此不需要写出完整的命名空间 @{ ViewBag.ItemsController = new Items

我有一个控制器
ItemsController
,它有一个实例方法
GetRecent()
,返回
IQueryable

在我的应用程序的索引页中,我想使用来自
ItemsController.GetRecent()的结果呈现部分视图
\u Recent.cshtml

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

我已将命名空间引用添加到~/Views/web.config,因此不需要写出完整的命名空间

    @{
        ViewBag.ItemsController = new ItemsController();
    }

    ...

    @Html.Partial("~/Views/Items/_Recent.cshtml",
                   ((ItemsController)ViewBag.ItemsController).GetRecentItems())
我想直接传递
newitemscontroller().GetRecentItems()
,或者将
GetRecentItems()
转换成一个静态方法,但是我不确定这应该是什么方向

我想知道这是否是从控制器构建局部视图的公认方法,如果不是,如何更有效地实现这一点?

RenderAction 第一个选项是
Html.Action
Html.RenderAction
()。这些都是,并且提供了一种更完善的方法来实现类似于您的代码示例的东西

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

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

不过,这是一个合理的选择

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

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

如果操作正确,这种方法还允许适当地分离关注点


  • (不相同,因为它不关注向局部视图传递数据)

感谢您的透彻解释,我想要完成的是一个局部视图,在页面加载时加载其余标记(因此页面源代码看起来很干净,没有客户端模板),并且如果用户在页面上花费很长时间,则允许进行尽可能简单的ajax驱动的更新。我想我会选择你的第二个选择,再次谢谢。