2008-09-17 26 views
97

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

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

+1

Escribí una guía sobre cómo manejé esto: http://www.britishdeveloper.co.uk/2010/06/mvc-pass-viewmasterpage-model.html debería ayudar – BritishDeveloper

Respuesta

75

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 correcta, 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 vista inflexible de tipos que contiene sólo la información pertinente a la misma:

public class MasterViewData 
{ 
    public ICollection<string> Navigation { get; set; } 
} 

Cada vista usando esa página maestra toma una clase de vista de datos con establecimiento inflexible que contiene su información y que deriva de las páginas maestras vista de datos:

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

Dado que no quiero controladores individuales saber nada acerca de la elaboración de los datos de las páginas maestras que encapsulan la lógica de que en una fábrica que se pasa a cada controlador:

public interface IViewDataFactory 
{ 
    T Create<T>() 
     where T : MasterViewData, new() 
} 

public class ProductController : Controller 
{ 
    public ProductController(IViewDataFactory viewDataFactory) 
    ... 

    public ActionResult Index() 
    { 
     var viewData = viewDataFactory.Create<ProductViewData>(); 

     viewData.Name = "My product"; 
     viewData.Price = 9.95; 

     return View("Index", viewData); 
    } 
} 

Inheritance coincida con el maestro para ver bien relación, pero cuando se trata de representación parciales/controles de usuario que va a componer sus datos de vista en las páginas vista de datos, 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); %> 

Esta es sólo ejemplo de código y no se pretende para compilar como es. Diseñado para ASP.Net MVC 1.0.

+4

Este es el método recomendado por Scott Gutherie, entonces tendría que estar de acuerdo. –

+0

@Simon Fox: ¿tiene un enlace a la recomendación de scottgu? No pude encontrarlo – orip

+4

http://weblogs.asp.net/scottgu/archive/2007/12/06/asp-net-mvc-framework-part-3-passing-viewdata-from-controllers-to-views.aspx#5415732 –

6

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

0

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

0

I cosa que otra buena manera podría ser la creación de interfaz de vista con cierta propiedad como ParentView de alguna de las interfaces, por lo que se puede utilizar tanto para los controles que necesitan una referencia a la página (control principal) y para vistas maestras a las que se debe acceder desde las vistas.

2

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

Siempre habrá algunas propiedades de modelo comunes entre páginas.

20

EDITAR

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

respuesta original

realidad Microsoft ha publicado una entrada en the "official" way para manejar esto. Esto proporciona un recorrido paso a paso con una explicación de su razonamiento.

En resumen, recomiendan utilizar una clase abstracta de controlador, pero compruébalo usted mismo.

+0

¡GRACIAS! Ese ejemplo es EXACTAMENTE lo que estoy haciendo ...categoría en cada página proveniente de la base de datos. – Martin

+0

Scott Gutherie, uno de los autores de MVC recomienda la solución provista por @Generic Error debajo de –

+6

, creo que la forma oficial no es buena –

0

Las otras soluciones carecen de elegancia y tardan demasiado. Me disculpo por hacer esta cosa muy triste y empobrecida casi todo un año más tarde:

<script runat="server" type="text/C#"> 
    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 
     MasterModel = SiteMasterViewData.Get(this.Context); 
    } 

    protected SiteMasterViewData MasterModel; 
</script> 

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

+0

para muchos esto puede parecer un poco hacky o 'sucio' pero hace el trabajo rápidamente. – argh

+0

¿Me pregunto si ASP.NET MVC 2 ha resuelto este problema? – rasx

+0

Ugh. Su código parece mucho más difícil de mantener que si hubiera utilizado Html.RenderAction(). –

59

Prefiero romper las piezas controladas por datos de la vista maestra en parciales y renderizarlas usando Html.RenderAction. Esto tiene varias ventajas distintas sobre el enfoque de herencia de 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 los modelos de su 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.
+3

+1. Otra ventaja es que puede tener la misma vista para usar diferentes páginas maestras dependiendo del estado actual del tiempo de ejecución. – StriplingWarrior

+1

Me gusta mucho esta respuesta; los otros enfoques descritos parecen un poco complicados. – Paddy

+2

Esta es la solución más elegante en mi opinión. – autonomatt

Cuestiones relacionadas