cómo rellenar la vista parcial para mostrarla en cada página

Esta es probablemente una pregunta tonta, pero estoy tratando de averiguar cómo completar un ViewModel para una vista parcial que muestra el DisplayName de los usuarios registrados. Esta vista parcial está en el diseño principal, por lo que estará en todas las páginas. Suena simple, lo sé; sin embargo, por mi vida, no puedo encontrar la mejor manera de llevar los datos a la Vista. ¿Cómo conservo esta vista?

preguntado el 16 de mayo de 11 a las 17:05

¿La vista parcial está fuertemente tipada? -

Sí, tiene @model Web.ViewModels.LoggedInUserPartailViewModel -

tratando de averiguar cuándo y dónde usar el modelo de vista para obtener los datos en el parcial -

mirando todo esto ahora chicos. Ustedes son geniales gracias por las respuestas rápidas. -

2 Respuestas

Probablemente, la mejor forma sería utilizar acciones secundarias junto con Html.Action helper.

Entonces, como siempre en ASP.NET MVC, comienza con un modelo de vista que representará la información que está dispuesto a manipular / mostrar en una vista:

public class UserViewModel
{
    public string FullName { get; set; }
}

luego un controlador:

public class UsersController: Controller
{
    // TODO: usual constructor injection here for
    // a repository, etc, ..., omitted for simplicity

    public ActionResult Index()
    {
        var name = string.Empty;
        if (User.Identity.IsAuthenticated)
        {
            name = _repository.GetFullName(User.Identity.Name);
        }
        var model = new UserViewModel
        {
            FullName = name
        };
        return PartialView(model);
    }
}

una vista parcial correspondiente:

@model UserViewModel
{
    // Just to make sure that someone doesn't modify
    // the controller code and returns a View instead of
    // a PartialView in the action because in this case
    // a StackOverflowException will be thrown (if the child action
    // is part of the layout)
    Layout = null; 
}
<div>Hello @Model.FullName</div>

luego continúe en su _Layout e incluya esta acción:

@Html.Action("Index", "Users")

Obviamente, la siguiente mejora de este código sería evitar acceder a la base de datos en cada solicitud, pero almacenar esta información en algún lugar una vez que el usuario inicie sesión, ya que estará presente en todas las páginas. Lugares excelentes para esto son, por ejemplo, la parte userData de la cookie de autenticación cifrada (si está utilizando FormsAuthentication, por supuesto), Session, ...

contestado el 16 de mayo de 11 a las 21:05

Entonces, ¿el nombre de la vista parcial tiene que ser el mismo que el nombre de ActionResult? - CrazyCoderz

@ Asistente del asistente, sí, las convenciones habituales de ASP.NET MVC. Debería estar situado en el ~/Views/Users/Index.cshtml carpeta. Users porque ese es el nombre del controlador que usé en mi ejemplo y Index porque ese es el nombre de la acción que usé en mi ejemplo. - Darin Dimitrov

Veo. Estaba usando el nombre recomendado para la vista parcial comenzando con un _ como _LoggedInUserPartial.cshtml, esto se encuentra en la carpeta Ver / Compartida. - CrazyCoderz

public ActionResult _LoggedInUserPartial () {var model = new ViewModels.LoggedInUserPartailViewModel (); model.DisplayName = _profileService.GetDisplayNameFromProfile (User.Identity.Name); return PartialView (modelo); } Esto está muy bien. - CrazyCoderz

Podría considerar tener un método de acción infantil.

contestado el 16 de mayo de 11 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.