¿Cómo utilizar vista parcial fuertemente tipada dentro de otra vista?

publicado por: Anonymous

Como primera opción estoy intentando crear una vista parcial fuertemente tipada. La misma se renderizaría dentro de dentro de mi _Layout.cshtml ya que la idea es que esta vista parcial _UserInfoPartial.cshtml se vea en todas las demás vistas.

La segunda sería que desde un vista padre, por ejemplo desde el home/index, renderizar la vista antes mencionada.

¿Cómo podría hacer para pasarle otro model a la vista hija?

Modelo de la vista parcial:

public class DatosUsuario
{
    public short Compania { get; set; }
    public Legajo LegajoUsuario { get; set; }
    public Funcion Funcion { get; set; }
    public string UsuarioNT { get; set; }
}

Modelo de la vista padre:

public class Visita
{
    public short Compania { get; set; }
    public Local Local { get; set; }
    public DateTime Fecha { get; set; }
    public DateTime Periodo { get; set; }
    public Legajo LegajoGerente { get; set; }
    public Color Color { get; set; }
    public DateTime FechaCierre { get; set; }
}

Este es mi _Layout.cshtml

<body>
    <div class="container body-content">
        @RenderBody()
        <hr />
        @Html.Partial("_UserInfoPartial") @*aqui renderizo mi vista parcial*@
        <footer>
            <p>&copy; @DateTime.Now.Year</p>
        </footer>
    </div>

    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/bootstrap")
    @RenderSection("scripts", required: false)
</body>

No se porque opción ir, pero me parece la mas acertada de hacerlo en el layout ya que se debería mostrar en todas las vistas.

solución

Para este caso sería mejor usar un child action en lugar de solamente un partial view

en un controller, digamos Home:

[ChildActionOnly]
public ActionResult Child() {
    var model = new DatosUsuario();
    // ...
    return PartialView("_UserInfoPartial", model);
}

([ChildActionOnly] no es obligatorio para invocarlo, solo es para que no sea llamado directamente como una acción normal)

y luego en _Layout:

@Html.Action("Child", "Home")

@Html.Action escribe en el layout el resultado de invocar la acción indicada, y ahí puedes especificar la vista y el modelo que deseas usar

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *