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 hacer 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 a la vista. Es por eso que necesito los ViewModels.
¿No hay otra forma como (sin el 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)
}
asp.net-mvc
asp.net-mvc-3
Shawn Mclean
fuente
fuente
ViewBag
para cada uno en la vista, funciona muy bien@
su nombre al frente, como lo hice aquí.Respuestas:
Hay muchas formas ...
con tu BigViewModel haces:
puedes crear 2 vistas adicionales
Login.cshtml
y register.cshtml lo mismo
después de la creación, debe representarlos en la vista principal y pasarles el modelo de vista / datos de vista
entonces podría ser así:
o
el uso de partes ajax de su sitio web se vuelve más independiente
iframes
, pero probablemente este no sea el casofuente
@Html.RenderAction
informando un error que Expression debe devolver un valorRecomiendo usar
Html.RenderAction
y PartialViewResults para lograr esto; le permitirá mostrar los mismos datos, pero cada vista parcial aún tendría un modelo de vista única y elimina la necesidad de unBigViewModel
Entonces su vista contiene algo como lo siguiente:
Donde
Login
yRegister
son ambas acciones en su controlador definidas de la siguiente manera:El
Login
&Register
luego serían controles de usuario que residen en la carpeta Ver actual o en la carpeta Compartida y quisiera algo como esto:/Views/Shared/Login.cshtml: (o /Views/MyView/Login.cshtml)
/Views/Shared/Register.cshtml: (o /Views/MyView/Register.cshtml)
Y allí tiene una única acción de controlador, ver y ver el archivo para cada acción con cada uno totalmente distinto y no depende el uno del otro para nada.
fuente
RenderAction
. Siempre olvido su parte del paquete de futuros ya que mi proyecto siempre incluye ese dll por defecto. Realmente depende de los requisitos de preferencia y aplicación en cuanto a si los ciclos de mvc adicionales valen la separación que brinda en el lado del diseño. Muchas veces puede almacenar en caché losRenderAction
resultados, por lo que el único golpe que recibe es el ligero procesamiento adicional a través de la fábrica de controladores.Otra forma es usar:
He explicado cómo usar este método tanto en la vista como en el controlador para otro ejemplo: dos modelos en una vista en ASP MVC 3
En su caso, podría implementarlo utilizando el siguiente código:
En la vista:
Nota que he cambiado manualmente los atributos de Nombre para cada propiedad al crear el formulario. Esto debe hacerse, de lo contrario no se correlacionaría correctamente con el parámetro del modelo de tipo del método cuando los valores se envían al método asociado para su procesamiento. Sugeriría usar métodos separados para procesar estos formularios por separado, para este ejemplo utilicé los métodos Login1 e Login2. El método Login1 requiere tener un parámetro de tipo RegisterViewModel y Login2 requiere un parámetro de tipo LoginViewModel.
Si se requiere un enlace de acción, puede usar:
en el método del controlador para la vista, se debe crear una variable de tipo Tuple y luego pasarla a la vista.
Ejemplo:
o puede llenar las dos instancias de LoginViewModel y RegisterViewModel con valores y luego pasarlo a la vista.
fuente
EditorFor
oHiddenFor
(que es idealmente lo que quiero usar) las propiedades del modelo no se establecen cuando se invocan los métodosLogin1
/Login2
controller. Presumiblemente@Name=
se está ignorando el mapeo. ¿HiddenFor
Requiere algún otro truco para esta situación?Use un modelo de vista que contenga múltiples modelos de vista:
En tu opinión:
fuente
Respuesta: no
Sí , puedes usar Tuple (trae magia a la vista teniendo múltiples modelos).
Código:
fuente
Agregue este ModelCollection.cs a sus modelos
Controlador:
La vista:
fuente
una manera simple de hacer eso
podemos llamar a todos los modelos primero
luego envíe su modelo con viewbag
y a la vista
entonces use esto fácilmente como Modelo
fuente
Mi consejo es hacer un modelo de vista grande:
En su Index.cshtml, si por ejemplo tiene 2 parciales:
y en el controlador:
fuente
Quiero decir que mi solución fue como la respuesta proporcionada en esta página de stackoverflow: ASP.NET MVC 4, ¿varios modelos en una sola vista?
Sin embargo, en mi caso, la consulta linq que usaron en su controlador no funcionó para mí.
Esta es dicha consulta:
En consecuencia, "en su opinión, simplemente especifique que está utilizando una colección de modelos de vista" tampoco funcionó para mí.
Sin embargo, una ligera variación en esa solución funcionó para mí. Aquí está mi solución en caso de que esto ayude a alguien.
Aquí está mi modelo de vista en el que sé que solo tendré un equipo, pero ese equipo puede tener múltiples tableros (y tengo una carpeta ViewModels dentro de mi carpeta Modelos, por cierto, el espacio de nombres):
Ahora este es mi controlador. Esta es la diferencia más significativa de la solución en el enlace mencionado anteriormente. Construyo el ViewModel para enviarlo a la vista de manera diferente.
Entonces, en mi opinión, no lo especifico como una lista. Simplemente hago "@model TaskBoard.Models.ViewModels.TeamBoards". Entonces solo necesito un para cada uno cuando itero sobre los tableros del equipo. Aquí está mi punto de vista:
Soy bastante nuevo en ASP.NET MVC, por lo que me tomó un tiempo resolver esto. Entonces, espero que esta publicación ayude a alguien a resolver su proyecto en un plazo más corto. :-)
fuente
siempre puede pasar el segundo objeto en una ViewBag o View Data.
fuente
Cree una nueva clase en su modelo y propiedades de
LoginViewModel
yRegisterViewModel
:Luego úsalo
UserDefinedModel
en tu punto de vista.fuente
Este es un ejemplo simplificado con IEnumerable.
Estaba usando dos modelos en la vista: un formulario con criterios de búsqueda (modelo SearchParams) y una cuadrícula de resultados, y luché con la forma de agregar el modelo IEnumerable y el otro modelo en la misma vista. Esto es lo que se me ocurrió, espero que esto ayude a alguien:
...)
SearchViewModel.cs:
DelegateController.cs:
SearchParamsViewModel.cs:
fuente