none
Crear un dropdown y remplazar mi textboxfor RRS feed

  • 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>


    domingo, 12 de julio de 2020 21:47

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


    martes, 14 de julio de 2020 0:53
  • 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
    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. 

    lunes, 13 de julio de 2020 23:20
    Moderador
  • 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


    martes, 14 de julio de 2020 0:53
  • 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. 

    jueves, 16 de julio de 2020 13:07
    Moderador
  • 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
    domingo, 19 de julio de 2020 10:40