Principales respuestas
Crear un dropdown y remplazar mi textboxfor

Pregunta
-
Que tal, pue como el titulo lo dice, quisiera crear un DrowpDown y remplazar el actual textboxfor que tengo en mi vista.
Actualmente he creado un HttpGet el cual se autocompleta con la información del usuario. y el HttpPost el cual solo tengo permitido que se puedan editar ciertos campos incluyendo el órgano, el puesto, lo cual al momento de crearla pues fue lo más simple que se me ocurrió. ahora lo que quiero es mandar una lista tanto de los órganos como de los puestos "por funcionalidad".
Abajo les muestro como pido actualmente estos, he intentado alguno ejemplos pero no entiendo como adaptarlo a mi lógica.
[HttpGet] public ActionResult Editar(int Id) { var model = new EditEmpleadosViewModel(); using (var db = new sir_cjfEntities()) { var eEmpleado = db.empleados.Find(Id); model.ID = eEmpleado.id_empleado; model.Nombre = eEmpleado.nombre; model.ApPaterno = eEmpleado.ap_paterno; model.ApMaterno = eEmpleado.ap_materno; model.Organo = eEmpleado.id_organo; model.Puesto = eEmpleado.id_puesto; model.Usuario = eEmpleado.usuario; ViewBag.Organos = eEmpleado.id_organo(); } return View(model); } [HttpPost] public ActionResult Editar(EditEmpleadosViewModel model) { if (!ModelState.IsValid) { return View(model); } using (var db = new sir_cjfEntities()) { var eEmpleado = db.empleados.Find(model.ID); eEmpleado.nombre = model.Nombre; eEmpleado.ap_paterno = model.ApPaterno; eEmpleado.ap_materno = model.ApMaterno; eEmpleado.id_organo = model.Organo; eEmpleado.id_puesto = model.Puesto; if (model.Password != null && model.Password.Trim() != "") { eEmpleado.contrasena = model.Password; } db.Entry(eEmpleado).State = System.Data.Entity.EntityState.Modified; db.SaveChanges(); } return Redirect(Url.Content("~/CEmpleados/")); }
Este seria mi modelo del editar "Tengo el modelo de los empleados así como de los órganos y puestos que me creo la BD al hacer la coneión pero tengo entendido esos no se editan y por eso se crean los modelos personalizados"
public class EditEmpleadosViewModel { public int ID { get; set; } [Required] public string Nombre { get; set; } [Required] public string ApPaterno { get; set; } [Required] public string ApMaterno { get; set; } [Required]
public int Organo { get; set; } public IEnumerable<organos> Organos { get; set; } [Required] public int Puesto { get; set; } public IEnumerable<puestos> Puestos { get; set; } [Required]
public string Usuario { get; set; } [Display(Name = "Contraseña")] [StringLength(25, ErrorMessage = "La {0} debe de contener al menos {2} caracteres", MinimumLength = 5)] /*[RegularExpression(@"(?=.*\W)?(?=.*\d)", ErrorMessage = "Debe de Contener al menos ")]*/ [DataType(DataType.Password)] public string Password { get; set; } [Display(Name = "Confirmar Contraseña")] [Compare("Password", ErrorMessage = "La contraseñas no coinciden")] public string ConfirmPassword { get; set; } }
Esta seria la vista como pueden ver pues pido el id del órgano y del puesto a través de un textbox
@model SistemadeInformaciónRegional.Models.ViewModels.EditEmpleadosViewModel @{ ViewBag.Title = "Edición de Usuarios"; } <h2>@ViewBag.Title</h2> <div class="row"> <div class="col-md-12"> @using (Html.BeginForm("Editar", "CEmpleados", FormMethod.Post, new { })) { @Html.HiddenFor(d => d.ID) @Html.AntiForgeryToken() @Html.ValidationMessage("Error", new { @class = "text-danger" }) @Html.LabelFor(d => d.Nombre) @Html.TextBoxFor(d => d.Nombre, new { @class = "form-control", @readonly = "readonly" }) @Html.ValidationMessage("Nombre", new { @class = "text-danger" }) <br /> @Html.LabelFor(d => d.ApPaterno) @Html.TextBoxFor(d => d.ApPaterno, new { @class = "form-control", @readonly = "readonly" }) @Html.ValidationMessage("ApPaterno", new { @class = "text-danger" }) <br /> @Html.LabelFor(d => d.ApMaterno) @Html.TextBoxFor(d => d.ApMaterno, new { @class = "form-control", @readonly = "readonly" }) @Html.ValidationMessage("ApMaterno", new { @class = "text-danger" }) <br />
@Html.LabelFor(d => d.Organo) @Html.TextBoxFor(d => d.Organo, new { @class = "form-control" }) @Html.ValidationMessage("Órgano o Área", new { @class = "text-danger" }) <br /> @Html.LabelFor(d => d.Puesto) @Html.TextBoxFor(d => d.Puesto, new { @class = "form-control" }) @Html.ValidationMessage("Puesto", new { @class = "text-danger" }) <br />
@Html.LabelFor(d => d.Usuario) @Html.TextBoxFor(d => d.Usuario, new { @class = "form-control", @readonly = "readonly" }) @Html.ValidationMessage("Usuario", new { @class = "text-danger" }) <br /> @Html.LabelFor(d => d.Password) @Html.PasswordFor(d => d.Password, new { @class = "form-control" }) @Html.ValidationMessage("Password", new { @class = "text-danger" }) <br /> @Html.LabelFor(d => d.ConfirmPassword) @Html.PasswordFor(d => d.ConfirmPassword, new { @class = "form-control" }) @Html.ValidationMessage("ConfirmPassword", new { @class = "text-danger" }) <br /> <div style="text-align:right;"> <input type="submit" class="btn btn-success" value="Aplicar Edición" /> </div> } </div> </div>
Respuestas
-
hola
Para enviar los datos de @Html.DropDownList() podrias usar el ViewBag
Populate (Bind) DropDownList from ViewBag in ASP.Net MVC
fijate como usa
ViewBag.Fruits = PopulateFruits();
para asignar la lista
y define
@Html.DropDownList("FruitId", new SelectList(ViewBag.Fruits, "FruitId", "FruitName"), "Please select", new { @id = "ddlFruits" })
para la vista
Lo que si no uses la forma en que captura los datos en el post ya que puede defini un parametro que coincida con el name del dropdon para que model binding lo captura directamente
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Editado Leandro TuttiniMVP martes, 14 de julio de 2020 0:53
- Marcado como respuesta EricRRModerator jueves, 16 de julio de 2020 13:07
-
Logre Crearlo pero de una manera un poco diferente a que me me comentaron
Aquí dejo los cambios que hice y en donde por si a alguien más le llega a servir
Se creo in IDirectory en mi modelo tanto para Organo como Para modelo
[Required] [Display(Name = "Órgano o Área")] public int Organo { get; set; } public IDictionary<int, string> Organos { get; set; } [Required] [Display(Name = "Puestos")] public int Puesto { get; set; } public IDictionary<int, string> Puestos{ get; set; }
El get se modifico de la siguiente manera para se litaron lo valores de la tablas organos y puestos a través de los directorios Organos y Puestos y se mandaron a la vista
[HttpGet] public ActionResult Agregar() { var model = new CrearEmpleadoViewModel { Organos = new Dictionary<int, string>(), Puestos = new Dictionary<int, string>() }; using (var db = new sir_cjfEntities()) { model.Organos = db.organos.ToDictionary(x => x.id_organo, x => x.organo); model.Puestos = db.puestos.ToDictionary(x => x.id_puesto, x => x.puesto); } return View(model); }
Ya en la vista solo cree lo dropdownlist para ambos
@Html.LabelFor(d => d.Puesto) @Html.DropDownListFor(d => d.Organo, new SelectList(Model.Organos, "Key", "Value"), new { @class = "form-control" }) @Html.ValidationMessage("Organo", new { @class = "text-danger" }) <br /> @Html.LabelFor(d => d.Puesto) @Html.DropDownListFor(d => d.Puesto, new SelectList(Model.Puestos, "Key", "Value"), new { @class = "form-control" }) @Html.ValidationMessage("Puesto", new { @class = "text-danger" })
- Marcado como respuesta Diego VA domingo, 19 de julio de 2020 10:40
Todas las respuestas
-
Hola Diego VA,
Gracias por levantar tu consulta en los foros de MSDN. Entendimos su pregunta y vamos a darle seguimiento para buscar la mejor repuesta pertinente al caso.
Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte.
Gracias por usar los foros de MSDN.
Eric Ruiz
____________________________
Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.
Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.
-
hola
Para enviar los datos de @Html.DropDownList() podrias usar el ViewBag
Populate (Bind) DropDownList from ViewBag in ASP.Net MVC
fijate como usa
ViewBag.Fruits = PopulateFruits();
para asignar la lista
y define
@Html.DropDownList("FruitId", new SelectList(ViewBag.Fruits, "FruitId", "FruitName"), "Please select", new { @id = "ddlFruits" })
para la vista
Lo que si no uses la forma en que captura los datos en el post ya que puede defini un parametro que coincida con el name del dropdon para que model binding lo captura directamente
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Editado Leandro TuttiniMVP martes, 14 de julio de 2020 0:53
- Marcado como respuesta EricRRModerator jueves, 16 de julio de 2020 13:07
-
Hola Diego VA,
¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las respuestas proporcionadas?
Espero su respuesta.
Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte.
Gracias por usar los foros de MSDN.
Eric Ruiz
____________________________
Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.
Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.
-
Logre Crearlo pero de una manera un poco diferente a que me me comentaron
Aquí dejo los cambios que hice y en donde por si a alguien más le llega a servir
Se creo in IDirectory en mi modelo tanto para Organo como Para modelo
[Required] [Display(Name = "Órgano o Área")] public int Organo { get; set; } public IDictionary<int, string> Organos { get; set; } [Required] [Display(Name = "Puestos")] public int Puesto { get; set; } public IDictionary<int, string> Puestos{ get; set; }
El get se modifico de la siguiente manera para se litaron lo valores de la tablas organos y puestos a través de los directorios Organos y Puestos y se mandaron a la vista
[HttpGet] public ActionResult Agregar() { var model = new CrearEmpleadoViewModel { Organos = new Dictionary<int, string>(), Puestos = new Dictionary<int, string>() }; using (var db = new sir_cjfEntities()) { model.Organos = db.organos.ToDictionary(x => x.id_organo, x => x.organo); model.Puestos = db.puestos.ToDictionary(x => x.id_puesto, x => x.puesto); } return View(model); }
Ya en la vista solo cree lo dropdownlist para ambos
@Html.LabelFor(d => d.Puesto) @Html.DropDownListFor(d => d.Organo, new SelectList(Model.Organos, "Key", "Value"), new { @class = "form-control" }) @Html.ValidationMessage("Organo", new { @class = "text-danger" }) <br /> @Html.LabelFor(d => d.Puesto) @Html.DropDownListFor(d => d.Puesto, new SelectList(Model.Puestos, "Key", "Value"), new { @class = "form-control" }) @Html.ValidationMessage("Puesto", new { @class = "text-danger" })
- Marcado como respuesta Diego VA domingo, 19 de julio de 2020 10:40