none
Cargar DropDownList desde una base de datos RRS feed

  • Pregunta

  • Hola buen día a todos.

    Soy nuevo en asp y mvc y tengo un proyecto en visual studio con ASP.NET MVC C# donde estoy tratando de cargar un select que guarde los id y los inserte en la tabla que este relacionada en la base de datos. Estuve buscando y solo encontré ejemplos que utilizan EntityFramework, pero yo uso la Capa de datos, Capa Entidad y la Capa Web(donde tengo los controller y vistas),  pude guardar y listar tablas no relacionadas, sin una llave foránea.

    Capa entidad: Provincia

    namespace NegocioEntidad
    {
        public class BE_Tbl_GIProvincia
        {
            private int intIdProvincia = 0;
            private string strCodUbigeo = "";
            private string strDescripcion = "";
            private int intEstado = 1;
            private int intIdRegion = 0;
            private int intModo = 1;
    
            public int iIdProvincia
            {
                get { return intIdProvincia; }
                set { intIdProvincia = value; }
            }
    
            public string sCodUbigeo
            {
                get { return strCodUbigeo; }
                set { strCodUbigeo = value; }
            }
    
            public string sDescripcion
            {
                get { return strDescripcion; }
                set { strDescripcion = value; }
            }
    
            public int iEstado
            {
                get { return intEstado; }
                set { intEstado = value; }
            }
    
            public int iIdRegion
            {
                get { return intIdRegion; }
                set { intIdRegion = value; }
            }
    
            public int iModo
            {
                get { return intModo; }
                set { intModo = value; }
            }
        }
    }

    Acceso a datos: Provincia

    namespace AccesoDatos
    {
        public class DA_Tbl_GIProvincia
        {
            private SqlCommand cmd;
            private SqlDataReader dr;
    
            public List<BE_Tbl_GIProvincia> ListarTodo()
            {
                List<BE_Tbl_GIProvincia> listaProvincias = new List<BE_Tbl_GIProvincia>();
    
                using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["cnDBGISQLServer"].ToString()))
                {
                    using (cmd = new SqlCommand("spp_ListarTodo_Tbl_GIProvincia", cn))
                    {
                        cn.Open();
                        dr = cmd.ExecuteReader();
    
                        while (dr.Read())
                        {
                            BE_Tbl_GIProvincia objBEGIProvincia = new BE_Tbl_GIProvincia
                            {
                                iIdProvincia = Convert.ToInt32(dr["IdProvincia"]),
                                sCodUbigeo = Convert.ToString(dr["CodUbigeo"]),
                                sDescripcion = Convert.ToString(dr["Descripcion"]),
                                iEstado = Convert.ToInt32(dr["Estado"])
                            };
                            listaProvincias.Add(objBEGIProvincia);
                        }
                    }
                }
                return listaProvincias;
            }
    
            public void ObtenerRegistroXId(BE_Tbl_GIProvincia objBEGIProvincia)
            {
                using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["cnDBGISQLServer"].ToString()))
                {
                    using (cmd = new SqlCommand("spp_ObtenerRegistroXId_Tbl_GIProvincia", cn))
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.Add("@IdProvincia", SqlDbType.Int).Value = objBEGIProvincia.iIdProvincia;
                        cn.Open();
                        dr = cmd.ExecuteReader();
    
                        while (dr.Read())
                        {
                            objBEGIProvincia.iIdProvincia = Convert.ToInt32(dr["IdProvincia"]);
                            objBEGIProvincia.sDescripcion = Convert.ToString(dr["Descripcion"]);
                            objBEGIProvincia.iEstado = Convert.ToInt32(dr["Estado"]);
                        }
    
                    }
                }
            }
    
            public void Crud(BE_Tbl_GIProvincia objBEGIProvincia)
            {
                using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["cnDBGISQLServer"].ToString()))
                {
                    using (cmd = new SqlCommand("spp_Mantenimiento_Tbl_GIProvincia", cn))
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.Add("@IdProvincia", SqlDbType.Int).Value = objBEGIProvincia.iIdProvincia;
                        cmd.Parameters.Add("@Descripcion", SqlDbType.VarChar, 100).Value = objBEGIProvincia.sDescripcion;
                        cmd.Parameters.Add("@Estado", SqlDbType.Bit).Value = objBEGIProvincia.iEstado;
                        cmd.Parameters.Add("@Modo", SqlDbType.Int).Value = objBEGIProvincia.iModo;
    
                        cn.Open();
                        cmd.ExecuteNonQuery();
                    }
                }
            }
    
        }
    }

    Controlador: Provincia

    public class ProvinciaController : Controller
        {
            private DA_Tbl_GIProvincia objDAGIProvincia;
            private BE_Tbl_GIProvincia objBEGIProvincia;
    
            private DA_Tbl_GIRegion objDAGIRegion;
    
            // GET: Admin/Provincia
            public ActionResult Index()
            {
                objDAGIProvincia = new DA_Tbl_GIProvincia();
                return View(objDAGIProvincia.ListarTodo());
            }
    
            public ActionResult Agregar()
            {
                objDAGIRegion = new DA_Tbl_GIRegion();
                ViewBag.Region = new SelectList(objDAGIRegion.ListarTodo(), "IdRegion", "Descripcion");
                return View(new BE_Tbl_GIProvincia());
            }
        }

    Vista: Agregar, supe que se puede hacer con un DropDownList, pero no se como hacerlo

    @model BE_Tbl_GIProvincia
    @{
        ViewBag.Header = "Administrar Provincia";
        ViewBag.Controller = "Provincia";
        ViewBag.Title = "Agregar nueva provincia";
    
        DA_Tbl_GIRegion objDAGIRegion = new DA_Tbl_GIRegion();
        objDAGIRegion.ListarTodo();
        List<BE_Tbl_GIRegion> objBEGIRegion;
        //SelectList regionlist = new SelectList(objBEGIRegion.ToList(), "", "");
    
    }
    
    @using (Html.BeginForm("Create", "Provincia", FormMethod.Post, new { @id = "frm_NuevaProvincia" }))
    {
        <div class="panel panel-primary">
            <div class="panel-heading">
                <h3 class="panel-title">Agregar nuevo Provincia</h3>
            </div>
            <div class="panel-body">
                <div class="form-group">
                    @Html.Label("Region")
                    @*@Html.DropDownListFor(mProvincia => mProvincia.iIdRegion, objBEGIRegion, "--Seleccione Región--")*@
                    @Html.Label("Descripción")
                    @Html.TextBoxFor(mProvincia => mProvincia.sDescripcion, new { @class = "form-control", @maxlength = "100" })
                </div>
            </div>
            <div class="panel-footer">
                <div class="text-right">
                    <button type="submit" class="btn btn-primary">Guardar</button>
                    <a class="btn btn-default" href="~/Admin/Provincia/Index">Cancelar</a>
                </div>
            </div>
        </div>
    }

    Espero que alguien me pueda ayudar por  favor, estoy empezando en asp y mvc


    • Editado CSLévano miércoles, 2 de noviembre de 2016 16:39
    miércoles, 2 de noviembre de 2016 16:38

Todas las respuestas

  • Hola CSLévano,

    Cuando cargas un SelectList a un ViewBag, tienes que convertirlo al momento de mostrarlo en la vista.

    ViewBag.Region = new SelectList(objDAGIRegion.ListarTodo(), "IdRegion", "Descripcion");

    En la vista, para visualizar la data :

     @Html.DropDownListFor(m => m.iIdRegion, (SelectList)ViewBag.Region, "--Seleccione Región--", 
                                                                new { @class = "form-control" })

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    miércoles, 2 de noviembre de 2016 16:57
  • hola

    no entiendo, porque desde el action Index() envias un List<BE_Tbl_GIProvincia> cuando usas

    return View(objDAGIProvincia.ListarTodo());

    pero en el model de la view lo defines simple @model BE_Tbl_GIProvincia

    ahi hay algo que no cierra

    Ademas no se pone codigo que acceda a las capa de datos en la view, el codigo que defines en el cshtml esta mal cuando invocas al ListarTodo() en el html

    How to simple Html.DropDownListFor MVC.NET

    analiza el articulo y veras como enviar la lista que usas en el combo desde el action del controller

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 2 de noviembre de 2016 17:26
  • Hola Joel

    Sí, al parecer faltaba convertirlo, gracias!!

    • Editado CSLévano jueves, 3 de noviembre de 2016 4:39
    jueves, 3 de noviembre de 2016 4:21
  • Hola Leandro

    Uso return View(objDAGIProvincia.ListarTodo()); para poder listar en mi vista index... en un <table></table> eso es lo que pude ver en otros, pero me gustaría saber cual es la manera correcta.

    Respecto al código que accede a la capa datos, lo estoy haciendo de esa manera por que no sé cual es la manera correcta de hacerlo, pero ahora estudiare el enlace del articulo que me enviaste.

    Gracias!

    jueves, 3 de noviembre de 2016 4:29
  • hola

     >>para poder listar en mi vista index... en un <table></table> eso es lo que pude ver en otros, pero me gustaría saber cual es la manera correcta.

    en el codigo que has publicado no veo ningun <table>, ademas el model de la view no coincide con la lista que retorna el ListarTodo()

    se supone que el @model de la view debe coicidir con el tipo que envias desde el action, sino la lista enviala en el ViewBag asi el model puede ser diferente, entonces envias la lista del combo en el ViewBag y los datos en una clase como model de la view

    >>Respecto al código que accede a la capa datos, lo estoy haciendo de esa manera por que no sé cual es la manera correcta de hacerlo

    eso no esta mal, siempre que a la capa de datos la accedas desde el action, el codigo que has puesto en la view (el cshtml), eso si es incorrecto

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    jueves, 3 de noviembre de 2016 10:36