none
PartialView y ViewModel RRS feed

  • Pregunta

  • Hola, tengo una vista parcial que deberia mostrarme un ViewModel donde combino datos de dos y tres tablas, algo asi:

    NombreSeccion

    NombreCategoria (que pertenece a la seccion) 

    Lista de anuncios (anuncios que pertenecen a la categoria)

    A partir de AnunciosxCategoriaViewModel, he creado una accion en el controlador Anuncios, la PartialView se llama AnunciosxCategoria, esta deberia mostrarse al darle click a una lista de categorias, es decir mediante un ActionLink que tengo en la vista ListaCategorias que envia el id de categoria para que se muestren los anuncios correspondientes a esa categoria, pero sucede que no funciona y me muestra el siguiente error cuando doy el click sobre las categorias:

     

    El elemento de modelo pasado al diccionario es de tipo 'LaOcasionv03.Models.ViewModel.Anuncios.AnunciosxCategoriaViewModel', pero este diccionario requiere un elemento de modelo de tipo 'System.Collections.Generic.IEnumerable`1[LaOcasionv03.Models.ViewModel.Anuncios.AnunciosxCategoriaViewModel]'.

    Esta es mi accion del controlador Anuncios:

     

     public ActionResult AnunciosxCategoria(int id)
        {
          TempData["IDCategoria"] = id;
          var anuncios = anunciosRepo.GetAnunciosxCategoria(id);
          string nombreSeccion = seccionesRepo.GetNombreSeccion(categoriasRepo.GetIDSeccion(id));
          string nombreCategoria = categoriasRepo.GetNombreCategoria(id);
          return PartialView(new Models.ViewModel.Anuncios.AnunciosxCategoriaViewModel(anuncios, nombreSeccion, nombreCategoria));
         
        }

    Este aqui es  el codigo de AnunciosxCategoriaViewModel:

     

    namespace LaOcasionv03.Models.ViewModel.Anuncios
    {
     public class AnunciosxCategoriaViewModel
     {
      public IEnumerable<Models.Anuncios> _anuncios;
      public string _nombreSeccion;
      public string _nombreCategoria;
    
      public AnunciosxCategoriaViewModel(IEnumerable<Models.Anuncios> anuncios, string nombreSeccion,string nombreCategoria)
      {
       _anuncios = anuncios;
       _nombreSeccion = nombreSeccion;
       _nombreCategoria = nombreCategoria;
      }
    
      public IEnumerable<Models.Anuncios> Anuncios { get { return _anuncios; } }
      public string NombreSeccion { get { return _nombreSeccion; } }
      public string NombreCategoria { get { return _nombreCategoria; } }
    
     }
    }
    

     

    Alguna idea para solucionarlo?.

    Saludos cordiales

     


    lunes, 21 de marzo de 2011 2:47

Respuestas

  • Richof,

    Buenas! En tu caso debes usar ViewUserControl? Por que? Pues porque des de el controlador devuelves una vista parcial. La verdad es que no me fijé en ese detallito cuando te contesté... ;-)

    La regla es:

    1. Si devuelves una vista entera (return View(...)) => Archivo .aspx y ViewPage<...> en el Inherits.
    2. Si devuelves una vista parcial (return PartialView(...)) => Archivo .ascx y ViewUserControl<...> en el Inherits

    Por lo tanto lo que haces no es que sea recomendable o no, es que... es lo que debes hacer! ;-)

    Un saludo!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis
    • Marcado como respuesta Richof martes, 22 de marzo de 2011 19:13
    martes, 22 de marzo de 2011 16:13

Todas las respuestas

  • Buenas!

    Un intento de respuesta rápida, a ver que tal... :D

    Como tienes definida tu vista parcial AnunciosxCategoria? De que tipo es el modelo?

    Mira que el atributo Inherits del tag <%@ Page %> sea Inherits="System.Web.Mvc.ViewPage<Models.ViewModel.Anuncios.AnunciosxCategoriaViewModel>" (y que no sea Inherits="System.Web.Mvc.ViewPage<IEnumerable<Models.ViewModel.Anuncios.AnunciosxCategoriaViewModel>> o algo parecido).

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis
    lunes, 21 de marzo de 2011 16:37
  • Buenas!

    Un intento de respuesta rápida, a ver que tal... :D

    Como tienes definida tu vista parcial AnunciosxCategoria? De que tipo es el modelo?

    Mira que el atributo Inherits del tag <%@ Page %> sea Inherits="System.Web.Mvc.ViewPage<Models.ViewModel.Anuncios.AnunciosxCategoriaViewModel>" (y que no sea Inherits="System.Web.Mvc.ViewPage<IEnumerable<Models.ViewModel.Anuncios.AnunciosxCategoriaViewModel>> o algo parecido).

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    Hola Eduard, como siempre gracias por responder, he revisado ese detalle, pero c on ViewPage no me funciona, sin embargo con ViewUserControl si este es el resultado:

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<LaOcasionv03.Models.ViewModel.Anuncios.AnunciosxCategoriaViewModel>" %>
    

    Asi funciona, mis preguntas son: ¿es aconsejable esto?, ¿porque asi me funciona?

    Saludos :)

    lunes, 21 de marzo de 2011 20:39
  • Richof,

    Buenas! En tu caso debes usar ViewUserControl? Por que? Pues porque des de el controlador devuelves una vista parcial. La verdad es que no me fijé en ese detallito cuando te contesté... ;-)

    La regla es:

    1. Si devuelves una vista entera (return View(...)) => Archivo .aspx y ViewPage<...> en el Inherits.
    2. Si devuelves una vista parcial (return PartialView(...)) => Archivo .ascx y ViewUserControl<...> en el Inherits

    Por lo tanto lo que haces no es que sea recomendable o no, es que... es lo que debes hacer! ;-)

    Un saludo!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis
    • Marcado como respuesta Richof martes, 22 de marzo de 2011 19:13
    martes, 22 de marzo de 2011 16:13