2012-02-24 43 views
5

我想在MVC中使用viewmodel而不是使用viewbag。有沒有一種方法可以創建一些在我的所有控制器之間共享的通用視圖模型,然後在我的視圖中使用它?我需要什麼樣的代碼?我正在考慮在基本控制器中創建一些東西。那可能嗎?如何在MVC中創建通用視圖模型?

回答

7

我相信控制器和視圖之間傳遞數據的主要方法是創建一個類,它表示要傳遞給視圖的數據並將該模型變量傳遞給視圖方法。

/Models/Home/IndexViewModel.cs

namespace MyProject.Models.Home 
{ 
    public class IndexViewModel 
    { 
    public string Message { get; set; } 
    } 
} 

控制器/ HomeController.cs

public class HomeController 
{ 
    public ActionResult Index() 
    { 
    IndexViewModel model = new IndexViewModel(); 
    model.Message = "Hello World!"; 
    View(model); 
    } 
} 

/Views/Home/Index.cshtml(在剃刀MVC3)

@Model MyProject.Models.Home.IndexViewModel //strongly-typed view 

<h1>@model.Message</h1> 

讓我們來看一個簡單的例子,並根據您的具體要求進行構建。簡單的方法是讓每個視圖簡單地使用MyClass模型。然而,這變得非常不靈活,所以這就是我將如何保持設計的靈活性。我將假設有一些數據要傳遞給許多視圖(部分或全部)。

創建類,它表示你想傳遞給多個視圖中的數據:

/Models/SharedData.cs

namespace MyProject.Models 
{ 
    public class SharedData 
    { 
    public DateTime Birthday { get; set; } 
    } 
} 

創建一個接口,用於模型需要SharedData類。

/Models/ISharedDataViewModel.cs

namespace MyProject.Models 
{ 
    public interface ISharedDataViewModel 
    { 
    public SharedData Data { get; set; } 
    } 
} 

更新主頁IndexViewModel使用接口和shareddata

/Models/Home/IndexViewModel.cshtml

namespace MyProject.Models.Home 
{ 
    public class IndexViewModel: ISharedDataViweModel 
    { 
    public string Message { get; set; } 
    public ShardedData Data { get; set; } 
    } 
} 

創建知道如何顯示共享數據的部分視圖

/Views/Shared/SharedDataView.cs(剃刀中MVC3)

@Model MyProject.Models.ISharedDataViewModel //strongly-typed partial view 

@if (model != null && model.Data != null) 
{ 
<h3>@model.Data.Birthday.ToString()</h3> 
} 

更新首頁索引頁調用局部視圖

/Views/Home/Index.cshtml (在剃刀MVC3中)

@Model MyProject.Models.Home.IndexViewModel //strongly-typed view 

<h1>@model.Message</h1> 

@Html.Partial("SharedDataView", model) 

現在任何頁面都可以調用局部視圖,如果頁面模型實現ISharedDataViewModel

+0

^很好的解釋和最好的實現。 – jhartzell 2012-02-24 03:30:54