2014-07-08 36 views
0

我有一個母版稱爲_Layout.cshtml並放置在文件夾Views/Shared/_Layout.cshtml英寸 我創建了一個控制器:SharedController.cs將數據傳遞到_Layout.cshtml 但不會進入控制器。 如何將數據傳遞給每個加載主頁_Layout.cshtmlMVC 4主頁_layout傳遞數據

例如,這是控制器:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace HAnnoZero.Controllers 
{ 
    public class SharedController : Controller 
    { 
     public ActionResult _Layout() 
     { 
      ViewBag.help = "ciao"; 
      return View(); 
     } 
    } 
} 
+0

你到底做_layout是,母版頁,我不認爲你可以這樣做 –

+0

在母版頁我有一個菜單,在這個菜單中,我想插入標籤,顯示方法計數從db – ADC

+0

在動作中使用viewbag或在主佈局中編寫代碼 –

回答

3

首先,不要把它一個母版頁。這來自Web窗體。在MVC中,_Layout.cshtml是一個「佈局」。這可能看起來像語義,但區分很重要,因爲在Web窗體中,母版頁是它自己的權利的真正頁面,並且有自己的代碼。在MVC中,佈局只是一個帶有一些佔位符的HTML模板。控制器,特別是所請求的控制器的行爲,全權負責頁面上下文。這也意味着你不能有一個_Layout作用,增加了上下文的佈局,因爲這一行動沒有被調用,即使你沒有(通過將像在瀏覽器中/Shared/_Layout一個URL,它會加載_Layout.cshtml爲失敗時查看,因爲它需要一個粗淺的看法在調用填寫@RenderBody()

如果你想渲染它自己的上下文的東西在你的佈局,則必須使用童工的行爲。

控制器

[ChildActionOnly] 
public ActionResult Something() 
{ 
    // retrieve a model, either by instantiating a class, querying a database, etc. 
    return PartialView(model); 
} 

Something.cshtml

@model Namespace.To.ModelClass 

<!-- HTML that utilizes data from the model --> 

_layout。CSHTML

@Html.Action("Something", "ControllerSomethingActionIsIn") 
0

佈局頁不以這種方式工作。使用默認MVC項目時,由您的操作返回的視圖在_Layout頁面內呈現。

更多介紹_Layout頁見here

_Layout頁面中顯示信息的一種方法是使用從_Layout頁面調用的child action方法。

例如,_Layout.cshtml可能包含類似於一個電話:

@Html.Action("GetNews", "Home", new { category = "Sports"}) 

然後,你將有類似的控制器操作:

[ChildActionOnly] 
public ActionResult GetNews(string category) 
{ 
    .... 
} 
1

另一種方法是創建一個共同的基礎控制器,其他控制器繼承:

public abstract class BaseController : Controller 
{ 
    protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     filterContext.Controller.ViewBag.Title = "Hello world"; 
    } 
} 

public class SharedController : BaseController 
{ 
    ... 
} 

然後在_layout您只需使用:

<title>@ViewBag.Title</title>