2011-05-09 276 views
33

我的_Layout.cshtml中有一個名爲「_Header.cshtml」頭部的共享視圖。Asp.Net Mvc - 如何在共享視圖中使用「控制器」

我想從數據庫中顯示文本和圖像,所以我需要我的控制器進入數據庫並將其返回到_Header.cshtml。

我該怎麼做,因爲被調用的控制器總是與用戶每頁不同。有沒有辦法讓共享視圖控制器?

這裏是_Layout.cshtml

<div id="header"> 
     <div id="title"> 
      @Html.Partial("_Header") 
     </div> 

     <div id="logindisplay"> 
      @Html.Partial("_CultureChooser") 
      <br /> 
      @Html.Partial("_LogOnPartial") 
     </div> 

     <div id="menucontainer"> 
      @Html.Partial("_MenuPartial") 
     </div> 
    </div> 

    <div id="main"> 
     @RenderBody() 
     <div id="footer"> 
     </div> 
    </div> 

</div> 

回答

52

在你的動作位指示,你可以指定視圖的名字:您的_Layout.cshtml

public class MenuController : Controller 
{ 
    [ChildActionOnly] 
    public ActionResult Header() 
    { 
     var model = ... // go to the database and fetch a model 
     return View("~/Views/Shared/_Header.cshtml", model); 
    } 
} 

現在而不是@Html.Partial("_Header")這樣做:

@Html.Action("Header", "Menu") 
+0

我在問題中添加了_Layout.cshtml。這不是點擊,而是網站上的任何地方。 – 2011-05-09 15:15:04

+0

@達克,您點擊*意味着什麼?您可以在佈局中使用@ Html.Action幫助器方法,該方法將在相應的控制器上調用子操作。這比一個簡單的'Html.Partial'更強大,因爲在這裏你可以定義一個單獨的控制器/模型和視圖,這個站點的這個部分在任何地方都是重複的,而且獨立於主控制器。您可以結帳以下有關子動作的博客文章:http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx – 2011-05-09 15:16:59

+0

謝謝,我仍然需要學習MVC:PI現在有這個錯誤:執行處理程序'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper'的子請求時出錯。 – 2011-05-09 15:24:25

2

創建在控制器以使首部視圖中的一個的動作,然後簡單地調用@ Html.RenderAction的_Layout.cshtml內(「頭」)。

如果需要,您還可以將模型傳遞給RenderAction方法。

9

... 1年後只想一件事添加到季米特洛夫回答。您可以使控制器乾淨了一點:

public class MenuController : Controller 
{ 
    [ChildActionOnly] 
    public ActionResult Header() 
    { 
     var model = ... // go to the database and fetch a model 
     return Partial("_Header", model); 
    } 
} 
+0

你救了我,只是我認爲它必須是{return PartialView(「_ Header」,model); }我沒有找到部分方法,我錯了嗎? – QMaster 2016-11-04 20:43:24

0

我希望你問的問題是一樣.... 我們能有一個共享佈局視圖控制器。

簡單的答案是

號要實現這一目標,你必須創建用於同一目的的局部視圖,並把它放進你的共享佈局。通過這種方式你可以達到目標

相關問題