2012-02-24 3 views
5

Я бы хотел использовать viewmodel в MVC вместо использования 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; } 
    } 
} 

Обновление 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.

+0

^Отличное объяснение и лучшая реализация далеко. – jhartzell

Смежные вопросы