No lo he probado, pero es posible que desee registrar sus vistas y luego configurar los datos de la vista durante el proceso de activación.
Debido a que las vistas se registran sobre la marcha, la sintaxis de registro no lo ayuda a conectarse al Activated
evento, por lo que deberá configurarlo en un Module
:
class SetViewBagItemsModule : Module
{
protected override void AttachToComponentRegistration(
IComponentRegistration registration,
IComponentRegistry registry)
{
if (typeof(WebViewPage).IsAssignableFrom(registration.Activator.LimitType))
{
registration.Activated += (s, e) => {
((WebViewPage)e.Instance).ViewBag.Global = "global";
};
}
}
}
Esta podría ser una de esas sugerencias mías del tipo "la única herramienta es un martillo"; puede haber formas más simples habilitadas para MVC para hacerlo.
Editar: enfoque alternativo, menos código, solo conéctelo al controlador
public class SetViewBagItemsModule: Module
{
protected override void AttachToComponentRegistration(IComponentRegistry cr,
IComponentRegistration reg)
{
Type limitType = reg.Activator.LimitType;
if (typeof(Controller).IsAssignableFrom(limitType))
{
registration.Activated += (s, e) =>
{
dynamic viewBag = ((Controller)e.Instance).ViewBag;
viewBag.Config = e.Context.Resolve<Config>();
viewBag.Identity = e.Context.Resolve<IIdentity>();
};
}
}
}
Edición 2: otro enfoque que funciona directamente desde el código de registro del controlador:
builder.RegisterControllers(asm)
.OnActivated(e => {
dynamic viewBag = ((Controller)e.Instance).ViewBag;
viewBag.Config = e.Context.Resolve<Config>();
viewBag.Identity = e.Context.Resolve<IIdentity>();
});
Nicholas Blumhardt
fuente
Resolve
partee.Context.Resolve
? Debo mencionar que estoy acostumbrado a Ninject ...La mejor manera es usar ActionFilterAttribute y registrar su clase personalizada en su global. asax (Application_Start)
registre su clase personalizada en su global. asax (Application_Start)
Entonces puedes usarlo en todas las vistas
También hay otra forma
Creando un método de extensión en HtmlHelper
Entonces puedes usarlo en todas las vistas
fuente
MembershipService
?Dado que las propiedades de ViewBag están, por definición, vinculadas a la presentación de la vista y a cualquier lógica de vista ligera que pueda ser necesaria, crearía una WebViewPage base y establecería las propiedades en la inicialización de la página. Es muy similar al concepto de un controlador base para lógica repetida y funcionalidad común, pero para sus puntos de vista:
Y luego
\Views\Web.config
, establezca lapageBaseType
propiedad:fuente
ViewBag.Title
propiedad y luego lo único en el diseño compartido es<title>@ViewBag.Title</title>
. Realmente no sería apropiado para algo como una página de vista de aplicación base, ya que cada vista es distinta, y la página de vista base sería para datos que son realmente comunes en todas las vistas.La publicación de Brandon está en lo cierto. De hecho, llevaría esto un paso más allá y diría que simplemente debe agregar sus objetos comunes como propiedades de la WebViewPage base para que no tenga que lanzar elementos desde ViewBag en cada Vista. Hago mi configuración de CurrentUser de esta manera.
fuente
'ASP._Page_Views_Shared__Layout_cshtml' does not contain a definition for 'MyProp' and no extension method 'MyProp' accepting a first argument of type 'ASP._Page_Views_Shared__Layout_cshtml' could be found (are you missing a using directive or an assembly reference?)
Podría usar un ActionResult personalizado:
O incluso un ActionFilter:
Tenía un proyecto MVC 2 abierto, pero ambas técnicas aún se aplican con cambios menores.
fuente
No tiene que meterse con acciones o cambiar el modelo, solo use un controlador base y transmita el controlador existente desde el contexto de vista de diseño.
Cree un controlador base con los datos comunes deseados (título / página / ubicación, etc.) y la inicialización de la acción ...
Asegúrese de que cada controlador use el controlador base ...
Transmita el controlador base existente desde el contexto de vista en su
_Layout.cshml
página ...Ahora puede consultar los valores en su controlador base desde su página de diseño.
fuente
Si desea verificar el tiempo de compilación e intellisense para las propiedades en sus vistas, ViewBag no es el camino a seguir.
Considere una clase BaseViewModel y haga que sus otros modelos de vista hereden de esta clase, por ejemplo:
Modelo de vista base
Ver ViewModel específico
Ahora ver código puede acceder a la propiedad directamente en la vista
fuente
He encontrado que el siguiente enfoque es el más eficiente y brinda un excelente control utilizando el archivo _ViewStart.chtml y las declaraciones condicionales cuando es necesario:
_ ViewStart :
VistaA :
Nota :
fuente