Как я могу создать модель общего вида в MVC? - PullRequest
5 голосов
/ 24 февраля 2012

Я хотел бы использовать viewmodel в MVC вместо viewbag.Есть ли способ, которым я мог бы создать какую-то общую модель представления, которая будет использоваться всеми контроллерами, а затем использовать ее в моих представлениях?Какой код мне понадобится для этого?Я думал, может быть, создать что-то в базовом контроллере.Это возможно?

1 Ответ

7 голосов
/ 24 февраля 2012

Я считаю, что основной метод передачи данных между контроллерами и представлениями - это создание класса, представляющего данные, которые вы хотите передать в ваше представление, и передача этой переменной модели в метод представления.

/ Модели / Главная / 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);
  }
}

/ Просмотров / Home / Index.cshtml (в Razor MVC3)

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

<h1>@model.Message</h1>

Давайте возьмем этот простой пример и перейдем к вашему конкретному запросу. Самый простой способ - позволить каждому представлению просто использовать модель MyClass. Тем не менее, это становится очень негибким, поэтому вот что я хотел бы сделать, чтобы сохранить гибкость дизайна. Я предполагаю, что есть некоторые данные, которые вы хотите передать многим представлениям (некоторые или все).

Создайте класс, который представляет данные, которые вы хотите передать нескольким представлениям:

/ Модели / SharedData.cs

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

Создайте интерфейс для моделей, которым требуется класс SharedData.

/ Модели / ISharedDataViewModel.cs

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

Обновление Home IndexViewModel для использования интерфейса и общих данных

/ Модели / Главная / 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>
}

Обновите страницу Домашнего указателя, чтобы вызвать частичное представление

/ Просмотров / Home / Index.cshtml (в Razor MVC3)

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

<h1>@model.Message</h1>

@Html.Partial("SharedDataView", model) 

Теперь любая страница может вызывать частичное представление, если модель страниц реализует ISharedDataViewModel.

...