none
DropDowList, que cargue primero <SELECCIONE> RRS feed

  • Pregunta

  • Hola

    Estoy trabajando con ASP.NET MVC 5, EF - Code first

    Al cargar el DropDownList me debe cargar <SELECCIONE> como primer item pero me esta cargando otro, la forma de cargar mi Drop, es la siguiente.

    Método

     public static List<UniversalExtend> Lista()
            {
                List<UniversalExtend> query = (from int n in Enum.GetValues(typeof(EnumDocumentoEdentidad))
                                                        select new UniversalExtend
                                                        {
                                                            Id = n,
                                                            Descripcion = Enum.GetName(typeof(EnumDocumentoEdentidad), n)
                                                        }).ToList();
                return query;
            }
    
            public static List<UniversalExtend> ListaTipoDocumentoIdentidad()
            {
                var listaItem = Lista();
                listaItem.Insert(0, new UniversalExtend()
                {
                    Id = -1,
                    Descripcion = "<SELECCIONE>"
                });
                return listaItem;
            }

    View

    <div class="form-group">
                @Html.LabelFor(model => model.DocumentoIdentidad, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.DropDownListFor(x=> x.DocumentoIdentidad, (SelectList)ViewBag.ListaDocumento)
                </div>
            </div>

    Viendo el código en la aplicación ya ejecutada

    <div class="form-group"> <label class="control-label col-md-2" for="DocumentoIdentidad">Documento Identidad</label> <div class="col-md-10"> <select data-val="true" data-val-required="El campo Documento Identidad es obligatorio." id="DocumentoIdentidad" name="DocumentoIdentidad">

    <option value="-1">&lt;SELECCIONE&gt;</option> <option selected="selected" value="0">OTROS</option> <option value="1">DNI</option> <option value="4">CARNET_EXTRANJERIA</option> <option value="6">RUC</option> <option value="7">PASAPORTE</option> </select> </div> </div>


    El problemita es que SELECCIONE tiene como valor -1, ¿No se si eso se puede poner en la vista para que cargue siempre el -1?


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 20 de enero de 2017 2:13

Respuestas

Todas las respuestas

  • Pedro Ávila,

    ¿Utilizas el parámetro selectedValue del constructor de la clase SelectList?

    ViewBag.ListaDocumento =  new SelectList(lista, "Id", "Descripcion", -1)


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 20 de enero de 2017 3:48
  • Hola Willams

    Si te refieres al Controller este es lo que uso

    // GET: Proveedor/Create
            public ActionResult Create()
            {
                var documento = SdProveedor.ListaTipoDocumentoIdentidad();
                ViewBag.ListaDocumento = new SelectList(documento, "Id", "Descripcion");
    
                var model = new ProveedorDto();
                return View(model);
            }

    Hice lo que me indicas 

    var documento = SdProveedor.ListaTipoDocumentoIdentidad();
                ViewBag.ListaDocumento = new SelectList(documento, "Id", "Descripcion", -1);

    

    Carga por defecto el segundo item


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    • Editado Pedro Ávila viernes, 20 de enero de 2017 4:03 ............
    viernes, 20 de enero de 2017 3:54
  • Hola Pedro Ávila,

    Porqué no usas el parámetro 'option label' que tiene el DropDownListFor ?

    Es raro, ya que el código compilado muestra el atributo 'selected' a la opción <Otros> por lo cual al iniciar este estará seleccionada.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    viernes, 20 de enero de 2017 4:00
  • Debes indicar el elemento que estará seleccionado por defecto (parámetro selectedValue) tal como te puse en el ejemplo del aporte anterior.
    viernes, 20 de enero de 2017 4:02
  • @Willams 

    Modifique mi ultima respuesta.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 20 de enero de 2017 4:05
  • @Joel

    Puedes darme un ejemplo de lo que me indicas?


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 20 de enero de 2017 4:06
  • Hola Pedro Ávila,

    Algo como :

    ViewBag.ListaDocumento = new SelectList(Lista(), "Id", "Descripcion");

    Y en la vista :

    @Html.DropDownListFor(x => x.DocumentoIdentidad, (SelectList)ViewBag.ListaDocumento, "<Seleccione>")

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    viernes, 20 de enero de 2017 4:11
  • @Joel

    Lo que me quieres decir es que cambie de técnica que el seleccione lo ponga en la View. Y como validarías cuando no seleccione ningun item y se mantenga el SELECCIONE.

    Yo había planeado validarlo con FluentValidation algo como esto:

    RuleFor(x => x.DocumentoIdentidad)
      .NotNull().WithMessage("Favor de asignar un elemento")
      .NotEqual((EnumDocumentoEdentidad)Convert.ToInt32(-1)).WithMessage("Debe seleccionar Documento de Identidad");

    Y de esa manera manejaba cuando el usuario no seleccione nada.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 20 de enero de 2017 4:18
  • @Willams

    Hice lo que me indicaste igual no funciona

    <div class="form-group">
                <label class="control-label col-md-2" for="DocumentoIdentidad">Documento Identidad</label>
                <div class="col-md-10">
                    <select data-val="true" data-val-required="El campo Documento Identidad es obligatorio." id="DocumentoIdentidad" name="DocumentoIdentidad"><option value="99">&lt;SELECCIONE&gt;</option>
    <option selected="selected" value="0">OTROS</option>
    <option value="1">DNI</option>
    <option value="4">CARNET_EXTRANJERIA</option>
    <option value="6">RUC</option>
    <option value="7">PASAPORTE</option>
    </select>
                </div>
            </div>
    

    El OTROS tiene una palabrita selected el cual SELECCIONE no lo tiene ese creo es el problema.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 20 de enero de 2017 4:23
  • hola

    si usas 

    @Html.DropDownListFor(x =>x.DocumentoIdentidad, (SelectList)ViewBag.ListaDocumento, "<Seleccione>")

    que valor envias en el model en el DocumentoIdentidad ? porque recuerda que si envias un valor alli lo seleccionara por defecto

    quizas esa propiedad deberias definirla nulable y no asignar ningun valor, para que marque el "<seleccione>" al mostrar la view

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 20 de enero de 2017 11:00
  • @Leandro

    Hice lo que me indicas 

    Proveedor

    namespace Demo.EntidadesDominio
    {
        public enum EnumDocumentoEdentidad : int { OTROS = 0, DNI = 1, CARNET_EXTRANJERIA = 4, RUC = 6, PASAPORTE = 7 };
        public class Proveedor
        {
            public int ProveedorId { get; set; }
            public string RazonSocial { get; set; }
            public EnumDocumentoEdentidad DocumentoIdentidad { get; set; }
            public string NumeroDocumento { get; set; }
            public string Direccion { get; set; }
            public string Telefono { get; set; }
            public string Email { get; set; }
        }
    }


    Model

    public class ProveedorDto
        {
            [Key]
            [Display(Name ="Código")]
            public int ProveedorId { get; set; }
            [Display(Name ="Razón Social")]
            public string RazonSocial { get; set; }
            [Display(Name ="Documento Identidad")]
            public EnumDocumentoEdentidad? DocumentoIdentidad { get; set; }
            [Display(Name ="Número de Documento")]
            public string NumeroDocumento { get; set; }
            [Display(Name ="Dirección")]
            public string Direccion { get; set; }
            [Display(Name ="Teléfono")]
            public string Telefono { get; set; }
            public string Email { get; set; }
        }


    Puse para que me acepte null la propiedad DocumentoIdentidad, tgambién modifique en la view.

    View

    <div class="form-group">
                @Html.LabelFor(model => model.DocumentoIdentidad, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.DropDownListFor(x => x.DocumentoIdentidad, (SelectList)ViewBag.ListaDocumento, "<<SELECCIONE>>")
                </div>
            </div>

    Al dar de alta un Proveedor y lo dejo en seleccione guarda el id del Drop como 0 y el valor de OTROS como puedes ver en el Enum es 0 también.

    Siguiendo lo que me indicastes si funciona cuando llamo a esa vista el Drop se muestra en <<SELECCIONE>>


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú



    • Editado Pedro Ávila viernes, 20 de enero de 2017 17:25 ...
    viernes, 20 de enero de 2017 17:19
  • hola

    el combo no funciona con un enum salvo que uses @Html.EnumDropDownListFor

    Using EnumDropDownListFor HTML Helper

    pero hasta ahora estabas definiendo la lista en el ViewBag porque lo cambias por enum?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Pedro Ávila viernes, 20 de enero de 2017 21:00
    viernes, 20 de enero de 2017 19:44
  • @Leandro 

    Estos datos son datos fijos es por eso que siempre los pongo en un enum, EXCELENTE no necesito hacer un método para cargar los elementos del Enum 

    Si te fijas al inicio del hilo tengo un método donde implemento la lista con Enum

    Validando con Fluent Validation

    RuleFor(x => x.DocumentoIdentidad)
                    .NotNull().WithMessage("Favor de asignar un elemento")
                    //.NotEqual((EntidadesDominio.EnumDocumentoEdentidad)Convert.ToInt32(null)).WithMessage("Debe seleccionar documento de identidad");
                    .NotEqual(x => x.DocumentoIdentidad).WithMessage("Debe seleccionar documento de identidad");


    En ambas lineas me indica que si es SELECCIONE debe seleccionar y eso esta bien, pero cuando selecciono OTROS que el valor es 0 igualmente me dice el mismo mensaje, como puedo hacer para validar el null como null y no como cero.

    FUNCIONO!!!

    View

    <div class="form-group">
                @Html.LabelFor(model => model.DocumentoIdentidad, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.EnumDropDownListFor(x => x.DocumentoIdentidad, "<<SELECCIONE>>", new { @class = "form-control" })
                    @Html.ValidationMessageFor(model => model.DocumentoIdentidad, "", new { @class= "text-danger" })
                </div>
            </div>

    Validación con FluentValidation

    RuleFor(x => x.DocumentoIdentidad)
                    .NotNull().WithMessage("Favor de asignar un elemento")
                    .NotEqual((EnumDocumentoEdentidad)Convert.ToInt32(-1)).WithMessage("Debe seleccionar documento de identidad");

    Me deja guardar OTROS que su valor es cero

    public enum EnumDocumentoEdentidad : 
    int { OTROS = 0, DNI = 1, CARNET_EXTRANJERIA = 4, RUC = 6, PASAPORTE = 7 };


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú






    • Editado Pedro Ávila viernes, 20 de enero de 2017 20:59 ...
    viernes, 20 de enero de 2017 19:59
  • Hola

    Gracias @Willams y @Joel por su ayuda.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 20 de enero de 2017 21:05