簡體   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