2012-07-12 109 views
10

我正在爲asp.net MVC佈局頁面設置共享內容(導航)。ASP.NET MVC 3局部視圖佈局頁面

這是我的部分視圖「_LayoutPartial.cshtml」,帶有從模型中提取導航數據的代碼。

@model MyApp.Models.ViewModel.LayoutViewModel 
<p> 

    @foreach (var item in Model.navHeader) 
    { 
     //Test dump of navigation data 
     @Html.Encode(item.Name); 
     @Html.Encode(item.URL); 

    } 
</p> 

下面是我的控制器「LayoutController.cs」的代碼的外觀。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using MyApp.Models.ViewModel; 

namespace MyApp.Controllers 
{ 
    public class LayoutController : Controller 
    { 

     // 
     // GET: /Layout/ 

     LayoutViewModel layout = new LayoutViewModel(); 

     public ActionResult Index() 
     { 
      return View(layout); 
     } 

    } 
} 

這裏是「_Layout.cshtml」頁面的代碼。我試圖使用Html.RenderAction(Action,Controller)方法在這裏調用部分視圖。

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
</head> 
<body> 
    <p> 
     @{Html.RenderAction("Index","Layout");} 
    </p> 

    @RenderBody() 
</body> 
</html> 

當佈局頁面執行@ {Html.RenderAction(「索引」,「佈局」);}線,就拋出執行子請求處理程序「System.Web.Mvc錯誤消息「錯誤.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper」。」

我在想什麼朋友?如何在佈局頁面中調用部分視圖?

謝謝大家提前!

+0

哪裏是您的局部視圖位於 – 2012-07-12 19:53:57

+0

〜/查看/共享/ _LayoutPartial.cshtml – Felasfaw 2012-07-12 20:02:53

回答

16

相反的:

public ActionResult Index() 
{ 
    return View(layout); 
} 

做:

public ActionResult Index() 
{ 
    return PartialView(layout); 
} 

如果你不這樣做,當你從你的孩子動作返回一個普通視圖,這個普通視圖試圖包含佈局,這反過來又試圖呈現子動作,然後又返回一個視圖,該視圖又包含佈局,該佈局反過來試圖呈現兒童動作,......並且我們最終得到了像這樣移植的那個名字同一網站。

同樣在你的部分你不需要做雙重編碼。該@剃刀功能已經做HTML編碼:

@model MyApp.Models.ViewModel.LayoutViewModel 
<p> 

    @foreach (var item in Model.navHeader) 
    { 
     @item.Name 
     @item.URL 
    } 
</p> 
+1

拋出「對象引用不設置爲一個對象的一個​​實例。」在部分視圖文件中的@foreach行。看起來像navHeader對象沒有項目。 – Felasfaw 2012-07-12 20:01:05

+1

你也可以直接編寫'@ Html.Action(「Index,」Layout「)'而不是'@ {Html.RenderAction(」Index「,」Layout「);}'儘管我不知道哪個更快。 – 2014-10-02 18:32:26

6

首先確認您的孩子的看法是Shared目錄

@Html.Partial("_LayoutPartial") 

OR

@{Html.RenderAction("actionname", "controller name");} 

內,不使用@Html.Encode(),剃刀已經爲你做了。只需使用

@item.Name 
@item.URL 
+0

第一個Html.Partial拋出「對象引用未設置爲對象的實例」錯誤第二個建議拋出我在第一篇文章中發佈的錯誤消息 – Felasfaw 2012-07-12 19:53:45

+0

您的局部視圖位於何處,我的意思是它必須位於內部共享目錄? – 2012-07-12 19:55:44

+0

是的局部視圖位於共享目錄內。 – Felasfaw 2012-07-12 19:57:37

2

我已經解決了這個錯誤讓佈局頁

System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper 

重要的! 第一個共享文件夾

在控制器內創建局部視圖,

public PartialViewResult Userdetails() 
{ 
    .... 
    return PartialView("PartialViewName", obj); 
} 

在佈局頁面,

@{Html.RenderAction("action","controller");} 
+0

太棒了!!!這對我有效!太棒了! – 2017-03-08 21:48:18

0

我知道這是一個老問題,但我想我會在這裏拋出此。您可以使用Html.ActionHtml.RenderAction。他們在技術上都做同樣的事情,但取決於你返回的內容有多少可以影響你應該真正使用哪一個以獲得最佳效率。

這兩種方法都允許您從視圖調用操作方法,並在視圖內輸出操作的結果。兩者之間的區別在於Html.RenderAction將直接將結果呈現給Response(如果該操作返回大量HTML,則效率更高),而Html.Action則返回帶結果的字符串。

Source