呈现来自控制器的局部视图(Render partial view from controller)

2019-10-17 22:27发布

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

在我的应用程序的索引页我想呈现的局部视图_Recent.cshtml使用从结果ItemsController.GetRecent()

要做到这一点,我已经写在我的Index.cshtml以下

我已经添加了命名空间引用到〜/查看/ web.config中,所以我不需要写出来的控制器完整的命名空间

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

    ...

    @Html.Partial("~/Views/Items/_Recent.cshtml",
                   ((ItemsController)ViewBag.ItemsController).GetRecentItems())

我想传递的new ItemsController().GetRecentItems()直接或转向GetRecentItems()到一个静态方法,但是我不知道这应该采取什么样的方向发展。

我想知道这是否是来自控制器构建的局部视图,如果没有,这怎么能更有效地完成一个接受的方式?

Answer 1:

的RenderAction

第一个选项是Html.ActionHtml.RenderAction ( 有什么区别? )。 这些都是在ASP.Net MVC框架的一部分 ,并提供更精美的手段来实现类似的代码示例东西。

通过这种方法,您的视图调用相应的控制器,它获取任何需要的数据,呈现局部视图,并将其返回。

我倾向于,因为它似乎向后,即认为“知道”了不少关于控制器及控制器的结构,并积极执行,而不仅仅是消费,从使用这种方法回避。

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

重塑

你可以通过“最近使用的项目”与主视图视图模型一起。 这是更多的努力来建模,但在你看来是不太耦合到控制器的“纯”。 您的局部视图不会需要改变。

异步渲染

你可以使用呈现一个AJAX调用适当的控制器最近的项目,并有控制器返回局部视图作为其结果。 这可能是最省力的,但在一些工作被延迟,直到页面的其余部分被渲染(可能允许延迟加载,和/或提高页面加载时间)优雅。

做得正确,这种做法也让关注体面的分离。


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


文章来源: Render partial view from controller