asp.net mvc 3 - visual - ¿Por qué no_ViewStart.cshtml puede acceder al objeto ViewBag?
mvc 4+ (6)
En resumen ... Utilice la bolsa de visualización del controlador.
ViewContext.Controller.ViewBag.MyVar = "myVal";
y
@ViewContext.Controller.ViewBag.MyVar
=============================================== =============
Hay buena información aquí: http://forums.asp.net/post/4254825.aspx
=============================================== =============
Generalmente, ViewData ["StoreName"] es igual que ViewBag.StoreName
Además, Controller.ViewData ["StoreName"] = Controller.StoreName = ViewContext.Controller.ViewBag.StoreName = ViewContext.Controller.ViewData ["StoreName"]
Pero cada vista y vista parcial obtiene su propia instancia de viewdata.
=============================================== =============
Hay otra solución aquí: https://stackoverflow.com/a/4834382/291753
=============================================== =============
Tengo el _ViewStart.cshtml predeterminado en mi carpeta / Views. Me gustaría poder acceder a mi objeto ViewBag para poder establecer el título predeterminado para todas mis vistas.
Sin embargo, con:
@{
Layout = "~/Views/Shared/SiteLayout.cshtml";
ViewBag.Title = "bytecourse - Online Courses in Technology";
}
Me sale "El nombre ''ViewBag'' no existe en el contexto actual" como un error de tiempo de ejecución.
¿Que necesito hacer?
No es 100% limpio, pero se ve una solución mediante el uso de PageData o un poco de enumeración en:
¿Cómo configuro las propiedades ViewBag en _ViewStart.cshtml?
Puede crear una página de diseño que esté utilizando sus datos de Viewbag y agregar diseño a su página _ViewStart en blanco; funcionará
en ViewStart.cshtml
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
Puede lograr esto usando vistas parciales. Coloque todo su código común relacionado con el Título en una vista parcial llamada Title.cshtml
en la carpeta compartida. En _viewstart
simplemente llame a la Vista parcial.
_ViewStart.cshtml :
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
@Html.Partial("Title")
~ / Shared / Title.cshtml :
@{
ViewBag.Title = "bytecourse - Online Courses in Technology";
}
Puede usar secciones en su _Layout si desea establecer un título predeterminado:
<title>
@if (IsSectionDefined("Title"))
{
@RenderSection("Title")
}
else
{
@:bytecourse - Online Courses in Technology
}
</title>
y dentro de las vistas puede anularlo:
@section Title {
Overriden title
}
Una razón más para no usar ViewBag
:-)
hmm, puede acceder a ViewBag a través de ViewData, por ejemplo, ViewContext.ViewData["Title"]
.
Por lo tanto, si establece los datos de ViewBag en un filtro de acción, por ejemplo, puede sacarlos de _ViewStart.cshtml usando ViewContext.ViewData["Title"]
.
Pero traté de asignar un valor usando ViewContext.ViewData["Key"] = value;
y no parece persistir en la vista real.