2016-03-16 204 views
-1

在我的HomeController.cs我有一些數據,我需要通過ViewBag傳遞給我的/Shared/_Layout.cshtml。但我不知道,我該怎麼做。ASP.NET MVC 5將數據從家庭控制器傳遞到佈局通過ViewBag

這是我/Shared/_Layout.cshtml

@foreach (var item in ViewBag.Order) 
{ 
    <li>@item.Name [ @item.Count ]</li> 
} 

這裏是HomeController.cs

public ActionResult Index() 
{ 
    ViewBag.Order = SELECT FROM DB -> ADD TO LIST 
} 
+3

如果你的問題是如何查詢數據庫並將結果分配給變量,您可能需要閱讀MVC和Entity Framework教程。 – CodeCaster

+0

不,我知道如何查詢數據庫,我有我的數據列表中包含名稱和計數,但我無法找到我怎麼可以在我的_Layout.cshtml中使用HomeController中的這些數據。在主頁上一切都很好,但在其他頁面上有一個問題,因爲沒有使用HomeController。所以我的問題是 - >我如何使用例如_Layout中的HomeController中的一些方法可以被整個應用程序在所有視圖中使用,我的_Layout在哪裏。 – Kicker

回答

3

您不必在佈局視圖訪問Viewbag不幸。然而 你可以使用:

  • PartialView調用的方法在基本控制器 簡單地定義一個基控制器,是所有的控制器父母。順便說一下,這對於一些錯誤處理也很方便。 並在您的佈局中使用@Html.Partial("ViewName")來呼叫您的基本控制器。
  • 使用Ajax調用 在您的佈局視圖中使用javascript來執行控制器函數,該函數返回您需要的數據。
  • 改爲使用會話變量 由於會話變量在佈局視圖中可訪問。

也可能有更多的答案,但我相信這些可能是您的問題最常見的解決方案。

(如果需要實現這些解決方案之一的任何幫助,請給我一個手勢,我會更深入地如何做到這一點解釋。)

+0

嗨!你可以向我解釋第一種方法,因爲我是MVC的新手 –

2

一個相當普遍的內容傳遞到佈局的方法,就是讓所有的ViewModel類實現一個基類(或接口),然後這將是您的視圖的視圖。

假設你想MYTEXT通過對一些文本到所有的網頁:

// My base view model class 
public class ViewModelBase { 
    public string MyText { get; set; } 
} 

// Some other view model 
public class MyOtherViewModel : ViewModelBase { 
    // other properties 
} 

// In the _Layout view, implement the base class 
@model ViewModelBase 
... 
@Html.DisplayFor(m => m.MyText) 
... 
@RenderBody() 
... 

這樣,你_layout視圖可以與ViewModelbase類的所有屬性的作用,而之後呈現的任何視圖仍將具有其子視圖模型的屬性 - 此處爲MyOtherViewModel - 可用。

希望有幫助!


在一個側面說明,我不建議延長使用ViewBags的將數據傳遞到MVC你的觀點,僅僅是因爲它具有非常低的可維護性與其它方法相比,由於它不被強類型。在我的選擇中,與使用視圖模型的ViewBags相比,ViewBags沒有任何實際的好處。

0

作爲替代方案,您可以創建一個基本的控制器從控制器繼承和分配ViewBag變量設置爲在基本控制器構造函數列表,像這樣

public class BaseController : Controller { 
    public BaseController(){ 
     ViewBag.Order = SELECT FROM DB -> ADD TO LIST 
    } 
} 

然後在其他控制器,從基本繼承控制器像這樣

public class HomeController : BaseController { 

} 

然後,這允許您爲每個控制器請求分配視圖包,視圖包變量將在佈局視圖中可用。

我自己已經使用這種技術來顯示整個網站上顯示的汽車製造清單。

作爲一個建議,雖然我會實現某種形式的緩存,以保存對後端的不斷調用。

但是,如果你想保持在家裏控制器的功能,您將需要重組,以便它可以通過使用jQuery/JavaScript的Ajax調用被用作@counterflux在他們的第二點曾建議

相關問題