vista variable usar una pasar mvc multiples modelos modelo llamar enviar desde datos controlador como c# asp.net-mvc model entity-framework-6 asp.net-mvc-viewmodel

c# - variable - ¿Cuál es la mejor práctica de pasar datos de un controlador a un diseño de vista?



pasar datos del controlador a la vista mvc php (1)

Actualmente tengo un sitio de MVC que necesita tener contenido dinámico en el encabezado de cada página.

Actualmente obtengo los datos requeridos como normales en el controlador y los coloco en un Modelo de Vista. En la vista, tomo los datos y pego las partes de la plantilla en el Viewbag y finalmente, en la página de diseño principal, tomo los datos de Viewbag y los paso al parcial que controla el encabezado.

He leído que no debería usar Viewbag cuando sea posible, y la cantidad de veces que paso la ronda de datos simplemente no me parece bien.

La única forma en que puedo pensar para mejorar esto es crear una sección en el diseño principal, y luego poner el parcial / datos en la sección de la vista; sin embargo, hay ~ 30 páginas y esto nuevamente no se siente como el ruta correcta

¿Hay una mejor manera de hacer esto / cuáles son las mejores prácticas para tomar datos dinámicos que tienen que ir a la vista principal?


Puede hacer esto con Child Actions. Puede reutilizar esta acción e incluso incluirla en la página _Layout.

Aquí hay una acción infantil para mostrar información de encabezado. Está marcado como ChildActionOnly por lo que solo se puede llamar dentro de otra vista. También aprovecha OutputCache para guardar un resultado durante 5 minutos.

[ChildActionOnly] [OutputCache(Duration = 5 * 60)] public ActionResult Header(string section) { var info = new HeaderInfo { Section = section, Today = DateTime.Now }; return PartialView("_header", info); }

_header.cshtml

@model HeaderInfo <div> <span>@Model.Section</span> <span>@Model.Today.ToLongTimeString()</span> </div>

Luego use esto en una vista o diseño con Html.Action () o .RenderAction () .

@Html.Action("Header", "Home", new { section = "Cake" }) // or @{Html.RenderAction("Header", "Home", new { section = "Pie" });}

Puede especificar una sección dentro de su diseño y luego renderizar condicionalmente si está presente en la vista.

_Layout.cshtml

@RenderSection("header", required: false)

vista principal

@section header { @{Html.RenderAction("Header", "Home", new { section = "Cake" })} }