Buenas,
La idea es la siguiente: Tengo un proyecto en ASP.NET 4.6.2 siguiendo el patron MVVM, tengo mi clase ViewModel que representa la pagina y una de las propiedades de ese ViewModel es un objeto que a su vez tiene como propiedad otro objeto. Paso a codigo lo escrito:
public class AlumnoViewModel : BaseViewModel { public List<AlumnoModel> Alumnos { get; set; } public AlumnoModel SearchEntity { get; set; } public AlumnoModel AddEntity { get; set; } public int TurnoId { get; set; } public int CarreraId { get; set; } public IEnumerable<SelectListItem> Carreras { get; set; } public IEnumerable<SelectListItem> Turnos { get; set; } }
La propiedad AddEntity
(Que es un AlumnoModel) seria mi POCO que luego va a ser mapeado con Automapper a su clase de dominio para persistencia.
Muestro como es mi AddEntity:
public class AlumnoModel { [Display(Name ="Nombre")] public string Nombre { get; set; } [Display(Name = "Apellido")] public string Apellido { get; set; } [Display(Name = "N° Legajo")] public string Legajo { get; set; } [Display(Name = "Dni")] public int Dni { get; set; } [Display(Name = "Carrera")] public CarreraModel Carrera { get; set; } [Display(Name = "Turno")] public TurnoModel Turno { get; set; } }
Casi todas las propiedades de esta clase son fuertemente tipadas excepto dos, que sera Carrera y Turno que son a su vez otros dos POCOs. Muestro uno porque son identicos:
public class TurnoModel { public int TurnoId { get; set; } [Display(Name = "Turno")] public string Descripcion { get; set; } }
Entonces la idea es la siguiente: Mi AddEntity
representa un alumno, ese alumno tiene varias propiedades, también tiene un turno y una carrera, por lo que pueden ver es una relación de 1 a n entre la tabla Turnos, Carrera con Alumnos.
Ahora bien, la idea es que al querer guardar un Alumno desde la capa de presentación a mi base de datos mi AddEntity
pasa al controlador con todos sus datos MENOS aquellos que son objetos complejos. El usuario elige un turno y una carrera a través de un @Html.DropDownListFor
paso a mostrar esta parte de la vista:
<div class="form-group"> @Html.LabelFor(m => m.AddEntity.Turno) @Html.DropDownListFor(m => m.Turnos, Model.Turnos, new { @class = "form-control" }) </div> <div class="form-group"> @Html.LabelFor(m => m.AddEntity.Carrera) @Html.DropDownListFor(m => m.Carreras, Model.Carreras, new { @class = "form-control" }) </div>
Como se ve, estoy creando dos DropDown con las propiedades Carreras y Turnos de mi ViewModel que son dos SelectListItem.
Lo que intente hacer es, por medio de jQuery, capturar el valor seleccionado en estos dos DropDown y pasárselo a estas dos propiedades que pasaran por medio de dos HiddenFor
. Estos son mis Hidden:
@Html.HiddenFor(m => m.AddEntity.Carrera.CarreraId) @Html.HiddenFor(m => m.AddEntity.Turno.TurnoId)
Y acá el jQuery:
if (action === "Save") { var carreraId = parseInt($ ("#Carreras option:selected").val()); var turnoId = parseInt($ ("#Turnos option:selected").val()); $ ("#AddEntity_Turno_TurnoId").val(turnoId); $ ("#AddEntity_Carrera_CarreraId").val(carreraId); }
La pregunta seria, hay alguna mejor manera de bindear estos datos sin tener que pasar por jQuery para bindearlo? Se que es un tema del DefaultModelBinder. Tendría que crear uno Custom?