Múltiples modelos en una vista
Quiero tener 2 modelos en una vista. La página contiene ambos LoginViewModel
y 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)
}
Hay muchas maneras...
con tu BigViewModel haces:
@model BigViewModel @using(Html.BeginForm()) { @Html.EditorFor(o => o.LoginViewModel.Email) ... }
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)}
Usando ajax partes de su sitio web se vuelven más independientes
iframes
, pero probablemente este no sea el caso
Recomiendo usar Html.RenderAction
PartialViewResults 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
& Register
está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
& Register
entonces 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.