【问题标题】:Render partial view from controller从控制器渲染局部视图
【发布时间】:2013-03-30 08:15:33
【问题描述】:

我有一个控制器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() 转换为静态方法,但我不确定这应该采取什么方向。

我想知道这是否是从控制器构建局部视图的公认方式,如果不是,如何更有效地完成?

【问题讨论】:

    标签: c# razor asp.net-mvc-4


    【解决方案1】:

    渲染动作

    第一个选项是Html.ActionHtml.RenderAction(What's the difference?)。这些是part of the ASP.Net MVC framework,并提供了一种更优雅的方法来实现与您的代码示例类似的东西。

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

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

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

    改造

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

    异步渲染

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

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


    • Related Question(不完全相同,因为它不专注于将数据传递给局部视图)

    【讨论】:

    • 感谢您的详尽解释,我想要完成的是在页面加载时加载其余标记的部分视图(因此页面源代码看起来很干净,没有客户端模板)并且允许一个简单的- 如果用户在页面上花费很长时间,则尽可能采用 ajax 驱动更新。我想我会选择你的第二个选项,再次感谢。
    猜你喜欢
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多