如何在MVC中创建通用视图模型?

时间:2012-02-24 01:10:04

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我想在MVC中使用viewmodel而不是使用viewbag。有没有办法可以创建一个在我的所有控制器之间共享的通用视图模型,然后在我的视图中使用它?我需要什么样的代码?我在考虑在基础控制器中创建一些东西。这可能吗?

1 个答案:

答案 0 :(得分:7)

我认为在控制器和视图之间传递数据的主要方法是创建一个类,该类表示要传递给视图的数据并将该模型变量传递给view方法。

<强> /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 (在Razor 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; }
  }
}

更新Home 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 (在Razor 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 (在Razor MVC3中)

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

<h1>@model.Message</h1>

@Html.Partial("SharedDataView", model) 

现在,如果页面模型实现ISharedDataViewModel,则任何页面都可以调用部分视图。