2012-02-24 65 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

相关问题