2011-06-07 70 views
11

在我的應用程序中,我有一些基本的用戶信息需要在每個頁面上顯示(名稱,配置文件img)。目前,我只需將_Layout.cshtml頁面中的模型設置爲ApplicationBaseModel類,整個應用程序中的所有其他視圖模型都必須從此類繼承,並且每個操作都必須爲基本模型設置適當的數據。確保_Layout.cshtml視圖模型數據的最優雅方式

我不介意這種簡單的繼承,這是事實上,在每一個單一的行動方法,我必須retreive數據並將其存儲在視圖模型。在我看來,這不是一個很好的解決方案。

任何人有解決這個問題的其他方式有什麼想法?

+0

您使用的是剃刀嗎? – mnemosyn 2011-06-07 15:44:59

+0

是的,我正在使用剃鬚刀 – jcvandan 2011-06-07 15:55:45

+0

沒關係......我一直在考慮更換頁面基本類型(這是剃鬚刀特有的),但這並不能解決您的問題*和*它很複雜......對不起 – mnemosyn 2011-06-07 15:58:32

回答

23

我將創建一個BaseController,它將檢索Initialize()覆蓋中的數據並將其設置爲ViewBag屬性。現在獲取您從BaseController創建的每個Controller,並在您的佈局中使用ViewBag屬性訪問您的用戶數據。

public class BaseController : Controller 
{ 
    protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 

     // retireve data 
     var data = new ApplicationBaseModel(); 

     // set to viewbag 
     ViewBag.UserData = data; 
    } 
} 

這樣,您不必從ApplicationBaseModel派生所有模型類。您可以強制輸入視圖,另外還可以將您的用戶數據作爲ViewBag屬性。

+0

尼斯妥協,謝謝你。 – 2012-04-09 22:51:09

+0

這看起來像一個體面的解決方案。對於從BaseController派生的每一個控制器,只要調用一次從BaseController派生出來的第一個Controller中的動作,它是否會執行一次'BaseController.Initialize'?換句話說,如果我有3個控制器 - 「HomeController」,「AboutController」,「AccountsController」,並且用戶從頁面上的鏈接訪問所有3控制器,「BaseController」會執行3次,或者只執行一次直到應用程序池被回收爲止的應用程序的生命週期)? – Shiva 2017-03-23 00:05:00

+0

@Shiva:這是一個實例方法,因此在調用任何ActionResult方法之前,它將針對每個控制器實例甚至每個請求執行。您使用應用程序池生命週期描述的內容適用於靜態方法。 – DanielB 2017-03-27 09:09:08

3

根據您想要生成ViewBag數據的時間,還可以使用函數OnActionExecuting或OnActionExecuted。這可能更合適,因爲在創建Controller時某些數據可能不可用。

public class MyController : Controller 
{ 
    //Executes before every action 
    protected override void OnActionExecuting(ActionExecutedContext context) 
    { 
     //Call the method from the base class 
     base.OnActionExecuting(context); 

     //Create the ViewBag data here 
     ViewBag.XYZ = XYZ(); 
    } 

    //Executes after every action 
    protected override void OnActionExecuted(ActionExecutedContext context) 
    { 
     //Call the method from the base class 
     base.OnActionExecuted(context); 

     //Create the ViewBag data here 
     ViewBag.XYZ = XYZ(); 

    } 
} 
+1

+1但是我的數據將在對象創建時可用 – jcvandan 2011-06-07 16:01:44

1

另一種選擇是將需要數據的佈局視圖的部分拆分並放入部分。然後從你的佈局視圖中調用Html.Action調用來返回具有必要viewmodel數據的部分。

相關問題