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!
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
Me gusta esta solución ... y no creo que sea un "problema mucho mayor" extender 'WebViewPage' – MilkyWayJoe
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. –