Múltiples modelos en una vista

Resuelto Shawn Mclean asked hace 13 años • 12 respuestas

Quiero tener 2 modelos en una vista. La página contiene ambos LoginViewModely RegisterViewModel.

p.ej

public class LoginViewModel
{
    public string Email { get; set; }
    public string Password { get; set; }
}

public class RegisterViewModel
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
}

¿Necesito crear otro ViewModel que contenga estos 2 ViewModels?

public BigViewModel
{
    public LoginViewModel LoginViewModel{get; set;}
    public RegisterViewModel RegisterViewModel {get; set;}
}

Necesito que los atributos de validación se presenten en la vista. Por eso necesito los ViewModels.

¿No hay otra manera como (sin BigViewModel):

 @model ViewModel.RegisterViewModel
 @using (Html.BeginForm("Login", "Auth", FormMethod.Post))
 {
        @Html.TextBoxFor(model => model.Name)
        @Html.TextBoxFor(model => model.Email)
        @Html.PasswordFor(model => model.Password)
 }

 @model ViewModel.LoginViewModel
 @using (Html.BeginForm("Login", "Auth", FormMethod.Post))
 {
        @Html.TextBoxFor(model => model.Email)
        @Html.PasswordFor(model => model.Password)
 }
Shawn Mclean avatar Jan 22 '11 04:01 Shawn Mclean
Aceptado

Hay muchas maneras...

  1. con tu BigViewModel haces:

    @model BigViewModel    
    @using(Html.BeginForm()) {
        @Html.EditorFor(o => o.LoginViewModel.Email)
        ...
    }
    
  2. puedes crear 2 vistas adicionales

    Iniciar sesión.cshtml

    @model ViewModel.LoginViewModel
    @using (Html.BeginForm("Login", "Auth", FormMethod.Post))
    {
        @Html.TextBoxFor(model => model.Email)
        @Html.PasswordFor(model => model.Password)
    }
    

    y registrar.cshtml lo mismo

    después de la creación, debe representarlos en la vista principal y pasarles el modelo de vista/viewdata

    entonces podría ser así:

    @{Html.RenderPartial("login", ViewBag.Login);}
    @{Html.RenderPartial("register", ViewBag.Register);}
    

    o

    @{Html.RenderPartial("login", Model.LoginViewModel)}
    @{Html.RenderPartial("register", Model.RegisterViewModel)}
    
  3. Usando ajax partes de su sitio web se vuelven más independientes

  4. iframes, pero probablemente este no sea el caso

Omu avatar Jan 21 '2011 23:01 Omu

Recomiendo usar Html.RenderActionPartialViewResults para lograr esto; Le permitirá mostrar los mismos datos, pero cada vista parcial aún tendrá un modelo de vista único y eliminará la necesidad de unBigViewModel

Entonces su vista contiene algo como lo siguiente:

@Html.RenderAction("Login")
@Html.RenderAction("Register")

Donde Login& Registerestán ambas acciones en su controlador definidas de la siguiente manera:

public PartialViewResult Login( )
{
    return PartialView( "Login", new LoginViewModel() );
}

public PartialViewResult Register( )
{
    return PartialView( "Register", new RegisterViewModel() );
}

Los Login& Registerentonces serían controles de usuario que residen en la carpeta Ver actual o en la carpeta Compartida y les gustaría algo como esto:

/Views/Shared/Login.cshtml: (o /Views/MyView/Login.cshtml)

@model LoginViewModel
@using (Html.BeginForm("Login", "Auth", FormMethod.Post))
{
    @Html.TextBoxFor(model => model.Email)
    @Html.PasswordFor(model => model.Password)
}

/Views/Shared/Register.cshtml: (o /Views/MyView/Register.cshtml)

@model ViewModel.RegisterViewModel
@using (Html.BeginForm("Login", "Auth", FormMethod.Post))
{
    @Html.TextBoxFor(model => model.Name)
    @Html.TextBoxFor(model => model.Email)
    @Html.PasswordFor(model => model.Password)
}

Y ahí tiene una única acción del controlador, vista y archivo de visualización para cada acción, cada una de las cuales es totalmente distinta y no depende una de la otra para nada.

TheRightChoyce avatar Jan 22 '2011 21:01 TheRightChoyce