2012-02-24 22 views
5

Me gustaría usar un modelo de vista en MVC en lugar de usar viewbag. ¿Hay alguna manera de crear un modelo de vista genérico compartido entre todos mis controladores y luego usar esto en mis vistas? ¿Qué tipo de código necesitaría para esto? Estaba pensando en crear algo en un controlador base. ¿Es eso posible?¿Cómo puedo crear un modelo de vista genérico en MVC?

Respuesta

7

Creo que el método predominante para pasar datos entre controladores y vistas es crear una clase que represente los datos que desea pasar a su vista y pasar esa variable de modelo al método de vista.

/Models/Home/IndexViewModel.cs

namespace MyProject.Models.Home 
{ 
    public class IndexViewModel 
    { 
    public string Message { get; set; } 
    } 
} 

Controladores/HomeController.cs

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

/Views/Home/Index.cshtml (en Razor MVC3)

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

<h1>@model.Message</h1> 

Tomemos este ejemplo simple y creemos para su solicitud específica. La manera más fácil sería permitir que cada vista simplemente use el modelo MyClass. Sin embargo, esto se vuelve muy inflexible, entonces esto es lo que haría para mantener el diseño flexible. Voy a suponer que hay algunos datos que desea pasar a muchas vistas (algunas o todas).

Crear clase que representa los datos que desea pasar a múltiples puntos de vista:

/Models/SharedData.cs

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

crear una interfaz para los modelos que requieren una clase Datos_compartidos.

/Models/ISharedDataViewModel.cs

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

actualización de la Casa IndexViewModel Para utilizar la interfaz y Datos_compartidos

/Models/Home/IndexViewModel.cshtml

namespace MyProject.Models.Home 
{ 
    public class IndexViewModel: ISharedDataViweModel 
    { 
    public string Message { get; set; } 
    public ShardedData Data { get; set; } 
    } 
} 

Crear una vista parcial que sepa cómo mostrar datos compartidos

/Views/Shared/SharedDataView.cs (en Razor MVC3)

@Model MyProject.Models.ISharedDataViewModel //strongly-typed partial view 

@if (model != null && model.Data != null) 
{ 
<h3>@model.Data.Birthday.ToString()</h3> 
} 

actualización de la página de inicio para llamar al Índice Vista parcial

/Views/Home/Index.cshtml (en Razor MVC3)

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

<h1>@model.Message</h1> 

@Html.Partial("SharedDataView", model) 

Ahora cualquier página puede solicitar la vista parcial si el modelo de las páginas implementa ISharedDataViewModel.

+0

^Gran explicación y la mejor implementación de lejos. – jhartzell

Cuestiones relacionadas