none
¿Es posible tener dos consultas a una BD y mostrarlos en una vista? RRS feed

  • Pregunta

  • Hola a todo@s:

    Estuve investigando pero no encuentro de como traer dos consultas para mostrar en una vista.

    Por ejemplo, en una vista tengo esto:

    @model IEnumerable<CapaDatos.usp_AnuncioSelectAllIndex_Result>


    Y luego, más abajo recorro en un foreach como se suele hacer y todo lo demás:

    @if (Model != null)
    {
        <div class="row">    
                <div class="col-md-12">
                    <div class="title-general-anuncio">
                        Informes y publicaciones
                    </div>
                       
                    @foreach (var item in Model)
                    {
                        if (item.Estado_Anuncio == "imagen")
                        {

    Pero mi pregunta es, ¿puedo traer dos consultas al inicio de mi vista?, así:

    @model IEnumerable<CapaDatos.usp_AnuncioSelectAllIndex_Result>

    @model IEnumerable<CapaDatos.usp_AnuncioSelectAllIndexOTRO_Result>

    Y luego mostrarlos en sus respectivos controles html.

    Gracias de antemano, saludos.


    lunes, 22 de junio de 2020 11:55

Respuestas

  • hola

    Pero estas asignando la lista directo como model cuando usas

    return View(db.ListarIndex());

    tendria que ser

    public class HomeController : Controller
    {
    	public ActionResult Index()
    	{            
    		using (DaMant_Anuncio db = new DaMant_Anuncio())
    		{
    			var model = new AnuncioIndexVarios()
    			{
    				Informes = db.ListarIndex()
    				Videos = db.ListarIndexVideos();
    			};
    		
    			return View(model);
    		}
    	}

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 23 de junio de 2020 1:27

Todas las respuestas

  • hola

    >>¿puedo traer dos consultas al inicio de mi vista?,

    tienes que unirlas en una clase

    public class AnuncioModel {
    
         public IEnumerable<CapaDatos.usp_AnuncioSelectAllIndex_Result> Anuncios {get;set;}
    
         public IEnumerable<CapaDatos.usp_AnuncioSelectAllIndexOTRO_Result> Otros {get;set;}
    
    }


    entonces usas

    @model AnuncioModel

    recuperas los datos de las dos listas y las asignas en las propiedades del model que usaras en la view

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 22 de junio de 2020 13:11
  • Hola Leandro.

    Ya hice lo que sugeriste, pero al momento de querer llamar o usar el campo de una consulta, no me figura en la lista desplegable.

    Mi nueva clase:

        public class AnuncioIndexVarios
        {
            public IEnumerable<CapaDatos.usp_AnuncioSelectAllIndex_Result> Informes { get; set; }
            public IEnumerable<CapaDatos.usp_AnuncioSelectAllIndexVideos_Result> Videos { get; set; }
        }

    Uso de la clase en la vista:

    @model IEnumerable<CapaDatos.AnuncioIndexVarios>

    Aqui es donde no encuentro los campos que requiero a mostrar:

    Gracias de antemano.

    lunes, 22 de junio de 2020 17:01
  • Uso de la clase en la vista:

    @model IEnumerable<CapaDatos.AnuncioIndexVarios>

    No, el @model en este caso no puede ser IEnumerable. Ya tienes metidos los dos IEnumerables dentro del AnuncioIndexVarios. Si le pones por fuera otro IEnumerable, entonces tienes un IEnumerable de IEnumerables, que no es lo que querías. Fíjate bien en cómo te lo ha puesto Leandro, que te indica el modelo sin el IEnumerable.

    Para recorrerlo con un for tienes que acceder a uno de los IEnumerables que hay dentro del modelo, por ejemplo:

    @foreach (var item in Model.Informes)

    y

    @foresch (var item in Model.Videos)

    lunes, 22 de junio de 2020 18:57
  • hola

    >>Uso de la clase en la vista:

    porque un IEnumerable de AnuncioIndexVarios ? eso no creo que este bien

    Se supone que las listas las tienes en las propiedades AnuncioIndexVarios  deberia ser solo una clase simple, no viste como puse la definicion en la respuesta anterior?

    Ademas Informes es una propiedad de lista, no se puede usar en un if directo, es Informes lo que debes iterar

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 22 de junio de 2020 19:16
  • Ok, gracias a ambos.

    Pero ahora me sale este error:

    The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[CapaDatos.usp_AnuncioSelectAllIndex_Result]', but this dictionary requires a model item of type 'CapaDatos.AnuncioIndexVarios'.

    Ante todo, explicaré lo siguiente:

    Ya tenía creado esta clase (DaMant_Anuncio) con estos métodos:

        public class DaMant_Anuncio : IDisposable
        {
            DB_FMPEntities db = new DB_FMPEntities();
    
            public List<usp_AnuncioSelectAllIndex_Result> ListarIndex()
            {
                return db.usp_AnuncioSelectAllIndex().ToList();
            }
    
            public List<usp_AnuncioSelectAllIndexVideos_Result> ListarIndexVideos()
            {
                return db.usp_AnuncioSelectAllIndexVideos().ToList();
            }


    El orden de inicio al ejecutar mi proyecto es el siguiente:

    Inicia en el HomeController:

        public class HomeController : Controller
        {
            public ActionResult Index()
            {            
                using (DaMant_Anuncio db = new DaMant_Anuncio())
                {
                    return View(db.ListarIndex());
                }
            }


    Luego entra este método de la clase DaMant_Anuncio :

    public List<usp_AnuncioSelectAllIndex_Result> ListarIndex()
            {
                return db.usp_AnuncioSelectAllIndex().ToList();
            }


    Luego al BD.Context:

            public virtual ObjectResult<usp_AnuncioSelectAllIndex_Result> usp_AnuncioSelectAllIndex()
            {
                return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<usp_AnuncioSelectAllIndex_Result>("usp_AnuncioSelectAllIndex");
            }


    Y ahora, en mi vista Index.cshtml ya he declarado al inicio como me indicaron:

    @model CapaDatos.AnuncioIndexVarios
    
    
    
    ...
    
    
    
    @if (Model != null)
    {
        <div class="row">    
                <div class="col-md-12">
                    <div class="title-general-anuncio">
                        Informes y publicaciones
                    </div>
                       
                    @foreach (var item in Model.Informes)
                    {
                        if (item.Estado_Anuncio == "imagen")
                        {

    Y no veo que esté entrando a la clase pública que he creado:

     public class AnuncioIndexVarios
        {
            public IEnumerable<CapaDatos.usp_AnuncioSelectAllIndex_Result> Informes { get; set; }
            public IEnumerable<CapaDatos.usp_AnuncioSelectAllIndexVideos_Result> Videos { get; set; }
        }


    Pero como mencioné al inicio me sale ese error :-(


    martes, 23 de junio de 2020 0:12
  • hola

    Pero estas asignando la lista directo como model cuando usas

    return View(db.ListarIndex());

    tendria que ser

    public class HomeController : Controller
    {
    	public ActionResult Index()
    	{            
    		using (DaMant_Anuncio db = new DaMant_Anuncio())
    		{
    			var model = new AnuncioIndexVarios()
    			{
    				Informes = db.ListarIndex()
    				Videos = db.ListarIndexVideos();
    			};
    		
    			return View(model);
    		}
    	}

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 23 de junio de 2020 1:27
  • Hola,

     

    gracias por confirmar que encontraste una respuesta a tu pregunta.

     

    Saludos cordiales

     

    Gabriel Castro

    jueves, 16 de julio de 2020 1:51