2012-04-10 17 views
11

Tengo una vista y quiero usar una página de diseño. En la página de diseño, quiero tener un banner condicional que parte de la vista se encenderá/apagará. Me preguntaba cómo puedo hacer esto?¿Cómo puedo establecer una variable en una página _Layout?

Tengo esto en la página _Layout.cshtml ...

@if (ShowBanner){ 

    <h1>banner</h1> 

} 

Me pregunto cómo puedo convertir este encendido/apagado de mi página MVC Vista? O si esto es lo correcto para hacer en absoluto? Quiero decir, si declaro esa variable en la página Ver seguramente el maestro no lo sabe? ¿Cómo se comunican los dos a través de C#? ¿Uso Viewbag? Más bien no

Sé que con formas todo es cuestión de hacer referencia a la página principal o miembro, no puede parecer bastante a verlo con MVC ...

Cualquier ayuda muy apreciada ...

Gracias Pete

Respuesta

12

estoy contigo, Exitos: evito el uso de ViewBag también. Aparte del nombre tonto, no me gusta el tipeo débil que viene con eso. Hay una solución, pero está algo involucrado, así que tengan paciencia conmigo.

Primero, cree una clase para almacenar los "consejos de visualización" que se pasarán al diseño. Me llamo creativamente esta clase "DisplayHints":

public class DisplayHints { 
    // anything that you want passed from a view to the layout goes here 
    public bool ShowBanner { get; set; } 
} 

A continuación, cree una clase derivada de WebViewPage<T> que será la nueva clase base de sus puntos de vista. Tenga en cuenta la forma en que tienen una propiedad denominada DisplayHints que se almacena en ViewData (que está disponible para el controlador, la vista, y la distribución):

public abstract class MyViewPage<T> : WebViewPage<T> { 
    public DisplayHints DisplayHints { 
    get { 
     if(!ViewData.ContainsKey("DisplayHints")) 
     ViewData["DisplayHints"] = new DisplayHints(); 
     return (DisplayHints)ViewData["DisplayHints"]; 
    } 
    } 
} 

Como comentarista señaló a continuación, ViewData es tipos débiles-, al igual ViewBag. Sin embargo, no hay forma de que sepa evitar el almacenamiento de algo en ViewData/ViewBag; esto solo minimiza la cantidad de variables de tipo débil en una. Una vez que haya hecho esto, puede almacenar tanta información fuertemente tipada en DisplayHints como desee.

Ahora que tiene una clase base para sus puntos de vista, en Web.config, tenemos que decirle MVC utilizar su clase base personalizada:

<pages pageBaseType="MyNamespace.Views.MyViewPage"> 

Suena como un montón de problemas, pero se gana algunos graves funcionalidad para todo este trabajo. Ahora, en su opinión, se puede establecer cualquier indicio de visualización que desee de la siguiente manera:

@{ DisplayHints.ShowBanner = true; } 

Y en su diseño, se puede acceder a ella con la misma facilidad:

@if(DisplayHints.ShowBanner) { 
    <div>My banner....</div> 
} 

espero que esto ayude!

+0

Interesante, pero ViewData todavía tiene los mismos problemas de tipeo débil que ViewBag, y se metió en muchos más problemas para llegar allí. – Maess

+0

Me gusta esta solución ... y no creo que sea un "problema mucho mayor" extender 'WebViewPage' – MilkyWayJoe

+0

Maess, sí,' ViewData' tiene los mismos problemas de escritura débil que 'ViewBag'. Sin embargo, en lugar de guardar un montón de sugerencias de visualización como variables débilmente tipadas, solo está guardando un objeto, en el que puede colocar tantas cosas fuertemente tipadas como desee, incluidas las estructuras más complicadas. En mi aplicación, esa clase 'DisplayHints' contiene más de veinte miembros ... todos fuertemente tipados. –

3

Tener un modelo para su diseño no es una buena idea, ya que obligará a todas las vistas a usar ese modelo. Sin embargo, podría poner ese tipo de información en el ViewBag y tener el valor poblado en el constructor de una de las bases de su controlador.

+1

Incluso podría tener un controlador base que siempre coloque la variable en el ViewBag – Joe

+0

Por supuesto, no estaba seguro de si el OP siempre usaría la misma base de controlador. – Maess

+0

si puede poner la variable en la bolsa de visualización, ¿por qué no puede ponerlo fuertemente en el controlador mismo? – liang

-1

intentar algo como esto:

en su controlador

var yourVariable; 
// other stuff and eventually fill the 'yourVariable' variable 
ViewBag.YourVariable = yourVariable; 

entonces en su vista

@if (ViewBag.YourVariable){ 

    <!-- Your markup --> 

} 
Cuestiones relacionadas