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

Jes*_*ica 5 asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

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

Eri*_*ips 7

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

/Models/Home/IndexViewModel.cs

namespace MyProject.Models.Home
{
  public class IndexViewModel
  {
    public string Message { get; set; }
  }
}
Run Code Online (Sandbox Code Playgroud)

控制器/ HomeController.cs

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

/Views/Home/Index.cshtml(在Razor MVC3中)

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

<h1>@model.Message</h1>
Run Code Online (Sandbox Code Playgroud)

让我们来看看这个简单的例子,并根据您的具体要求进行构建.简单的方法是允许每个视图只使用MyClass模型.然而,这变得非常不灵活,所以我将采取以下措施来保持设计的灵活性.我将假设有一些数据要传递给许多视图(部分或全部).

创建表示要传递给多个视图的数据的类:

/Models/SharedData.cs

namespace MyProject.Models
{
  public class SharedData
  {
    public DateTime Birthday { get; set; }
  }
}
Run Code Online (Sandbox Code Playgroud)

为模型创建一个需要SharedData类的接口.

/Models/ISharedDataViewModel.cs

namespace MyProject.Models
{
  public interface ISharedDataViewModel
  {
    public SharedData Data { get; set; }
  }
}
Run Code Online (Sandbox Code Playgroud)

更新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; }
  }
}
Run Code Online (Sandbox Code Playgroud)

创建一个知道如何显示共享数据的部分视图

/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>
}
Run Code Online (Sandbox Code Playgroud)

更新"主页索引"页面以调用"部分"视图

/Views/Home/Index.cshtml(在Razor MVC3中)

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

<h1>@model.Message</h1>

@Html.Partial("SharedDataView", model) 
Run Code Online (Sandbox Code Playgroud)

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