Pasar datos a la página maestra en ASP.NET MVC

¿Cuál es su forma de pasar datos a la Página maestra (utilizando ASP.NET MVC) sin romper las reglas MVC?

Personalmente, prefiero codificar el controlador abstracto (controlador base) o la clase base que se pasa a todas las vistas.

Si prefiere que sus vistas tengan clases de datos de vista fuertemente tipadas, esto podría funcionar para usted. Otras soluciones son probablemente más correctas, pero este es un buen equilibrio entre el diseño y la practicidad en mi humilde opinión.

La página maestra toma una clase de datos de vista fuertemente tipada que contiene solo información relevante para ella:

public class MasterViewData { public ICollection Navigation { get; set; } } 

Cada vista que usa esa página maestra toma una clase de datos de vista fuertemente tipada que contiene su información y deriva de los datos de la vista de páginas maestras:

 public class IndexViewData : MasterViewData { public string Name { get; set; } public float Price { get; set; } } 

Como no quiero que los controladores individuales sepan nada sobre cómo armar los datos de las páginas maestras, encapsulo esa lógica en una fábrica que se pasa a cada controlador:

 public interface IViewDataFactory { T Create() where T : MasterViewData, new() } public class ProductController : Controller { public ProductController(IViewDataFactory viewDataFactory) ... public ActionResult Index() { var viewData = viewDataFactory.Create(); viewData.Name = "My product"; viewData.Price = 9.95; return View("Index", viewData); } } 

La herencia coincide con el maestro para ver bien la relación, pero cuando se trata de representar parciales / controles de usuario, redactaré sus datos de vista en los datos de visualización de páginas, por ejemplo

 public class IndexViewData : MasterViewData { public string Name { get; set; } public float Price { get; set; } public SubViewData SubViewData { get; set; } } <% Html.RenderPartial("Sub", Model.SubViewData); %> 

Este es solo un código de ejemplo y no está destinado a comstackrse como está. Diseñado para ASP.Net MVC 1.0.

Prefiero separar las partes controladas por datos de la vista maestra en parciales y renderizarlas usando Html.RenderAction . Esto tiene varias ventajas distintas sobre el enfoque de herencia del modelo de vista popular:

  1. Los datos de la vista maestra están completamente desacoplados de los modelos de vista “normal”. Esta es la composición sobre la herencia y los resultados en un sistema más débilmente acoplado que es más fácil de cambiar.
  2. Los modelos de vista maestra se crean mediante una acción de controlador completamente separada. Las acciones “regulares” no necesitan preocuparse por esto, y no hay necesidad de una fábrica de datos de vista, lo que parece demasiado complicado para mi gusto.
  3. Si usa una herramienta como AutoMapper para asignar su dominio a sus modelos de vista, le resultará más fácil de configurar porque sus modelos de vista se parecerán más a sus modelos de dominio cuando no hereden los datos de la vista maestra.
  4. Con métodos de acción separados para datos maestros, puede aplicar fácilmente el almacenamiento en caché de resultados a ciertas regiones de la página. Generalmente, las vistas maestras contienen datos que cambian con menos frecuencia que el contenido de la página principal.

EDITAR

Generic Error ha proporcionado una mejor respuesta a continuación. ¡Por favor leelo!

Respuesta original

Microsoft ha publicado una entrada en la forma “oficial” para manejar esto. Esto proporciona un recorrido paso a paso con una explicación de su razonamiento.

En resumen, recomiendan usar una clase de controlador abstracto, pero compruébalo por ti mismo.

Los controladores abstractos son una buena idea, y no he encontrado una mejor manera. Estoy interesado en ver lo que otras personas han hecho, también.

Investigué un poco y encontré estos dos sitios. Tal vez podrían ayudar.

ASP.NET MVC Tip # 31 – Transferencia de datos a páginas maestras y controles de usuario

Pasar datos a páginas maestras con ASP.NET MVC

Encuentro que un padre común para todos los objetos de modelo que pasa a la vista es excepcionalmente útil.

Siempre tenderá a haber algunas propiedades de modelo comunes entre las páginas de todos modos.

El objeto Request.Params es mutable. Es bastante fácil agregarle valores escalares como parte del ciclo de procesamiento de solicitudes. Desde la perspectiva de la vista, esa información podría haber sido provista en QueryString o FORM POST. hth

Creo que otra buena forma podría ser crear una interfaz para ver con alguna propiedad como ParentView de alguna interfaz, para que pueda usarla tanto para los controles que necesitan una referencia a la página (control principal) como para las vistas maestras a las que se debe acceder desde puntos de vista.

Las otras soluciones carecen de elegancia y tardan demasiado. Me disculpo por hacer esta cosa tan triste y empobrecida casi un año después:

  

Así que claramente tengo este método estático Get () en SiteMasterViewData que devuelve SiteMasterViewData.