none
Como agregar un UserControl a una Vista en MVC y pasarle data RRS feed

  • Pregunta

  • Hola a todos espero que esten bien

    Estoy iniciandome con Asp.Net MVC "aun no de lleno pero si aprendiendo la idiologia y algunos conceptos". Estoy ahorita con el tema de los UserControls, generalmente desde Asp.Net tradicional tengo una carpeta con N UserControls los cuales uso en las paginas que quiera, deseo hacer algo similar en Mvc, pero he leido algo en internet y como que cada quien lo hace de distitnas maneras... Tambien hay unas personas que los guardan en la carpeta /View/Shared mientras que otras los guardan en las carpetas de las vistas /View/MiVista.

    En fin, me pueden ayudar con el tema? Es un UserControl sencillo el cual ya probe en una pagina independiente, algo asi...

    <ul>
            <% foreach(var data in (List<UserEntity>) ViewData["Data"])
                {%>
                    <li><%= data.Nombre %>, edad <%= data.Edad %>. Fecha de registro <%= ((DateTime)data.Fecha).ToString("dd/MM/yyyy") %></li>
                <%}
            %>
            </ul>

    Este es mi Controller "aunque supongo que esto no es relevante ya que sera usado en distitnas paginas "o vistas"

    public class DataController : Controller
        {
            public ActionResult Repeater()
            {
                ViewData["Data"] = ObtenerData();
                return View();
            }
            List<UserEntity> ObtenerData() { }
        }
        public class UserEntity
        {
            public string Nombre { get; set; }
            public int Edad { get; set; }
            public DateTime Fecha { get; set; }
        }

    Lo que necesito es que mi UserControl "hablando en terminos de asp.Net" tome como parametro, propiedad, etc un objeto tipo List<UserEntity> y lo renderee...

    Normalmente en Asp.Net lo que haria es que mi UserControl tendria un control Repeater y una propiedad

    public UserEntity Data { set { repeater1.DataSource = this; } }

    Gracias a todos de antemano


    • Editado AdyIr jueves, 27 de diciembre de 2012 19:15
    jueves, 27 de diciembre de 2012 15:43

Respuestas

  • deberia descartar 100% el ViewData y usar Raizor cuando trabaje con VS 2010?

    A ver, no nos liemos: no tiene nada que ver una cosa con la otra. El ViewData se puede usar tanto desde el motor de vistas Razor como desde el motor de vistas Aspx. De hecho, se pueden incluso usar vistas con ambos motores dentro del mismo proyecto, y se pueden pasar datos a ambas dentro del ViewData.

    Adicionalmente, en MVC3 se introdujo el ViewBag, que simplemente consiste en una sintaxis distinta para hacer lo mismo que hace el ViewData. Sigue siendo compatible tanto con el motor Razor como con el motor Aspx.

    Si la pregunta se refiere a si es mejor usar el motor Razor o el Aspx, mi opinión es que sí, que el Razor es mejor. Pero solo desde el punto de vista de que el código es más sencillo de escribir y de leer que el aspx. En cuanto a funcionalidad, los dos motores tienen la misma. Tanto uno como el otro soportan vistas parciales, ViewData/ViewBag y Helpers.

    • Marcado como respuesta AdyIr domingo, 6 de enero de 2013 6:11
    viernes, 28 de diciembre de 2012 19:06
  • En MVC es distinto que en WebForms. No hay UserControls sino "Vistas Parciales". Las vistas parciales, al igual que cualquier otra vista, se pueden opcionalmente almacenar en la carpeta "Shared" si se quiere que puedan ser usadas desde cualquier controlador. Si no es así, se ubican en su carpeta específica.

    En cuanto al paso de datos, la vista parcial "ve" el mismo Modelo que la vista principal que la incluye. Por lo tanto, puedes encapsular los datos que quieras pasarle dentro de dicho modelo. Alternativamente, puedes introducir los datos en el ViewData (como ya estás haciendo).

    Como alternativa a las vistas parciales, podrías definir dentro de tu código un "helper" de Html (al fin y al cabo no es más que una función dentro de una clase, que devuelve un HtmlString) y luego "incrustarlo" dentro de otra vista mediante <%=MiClase.MiHelper(parametros)%>.

    • Marcado como respuesta AdyIr domingo, 6 de enero de 2013 6:11
    viernes, 28 de diciembre de 2012 8:29

Todas las respuestas

  • En MVC es distinto que en WebForms. No hay UserControls sino "Vistas Parciales". Las vistas parciales, al igual que cualquier otra vista, se pueden opcionalmente almacenar en la carpeta "Shared" si se quiere que puedan ser usadas desde cualquier controlador. Si no es así, se ubican en su carpeta específica.

    En cuanto al paso de datos, la vista parcial "ve" el mismo Modelo que la vista principal que la incluye. Por lo tanto, puedes encapsular los datos que quieras pasarle dentro de dicho modelo. Alternativamente, puedes introducir los datos en el ViewData (como ya estás haciendo).

    Como alternativa a las vistas parciales, podrías definir dentro de tu código un "helper" de Html (al fin y al cabo no es más que una función dentro de una clase, que devuelve un HtmlString) y luego "incrustarlo" dentro de otra vista mediante <%=MiClase.MiHelper(parametros)%>.

    • Marcado como respuesta AdyIr domingo, 6 de enero de 2013 6:11
    viernes, 28 de diciembre de 2012 8:29
  • En MVC es distinto que en WebForms. No hay UserControls sino "Vistas Parciales". Las vistas parciales, al igual que cualquier otra vista, se pueden opcionalmente almacenar en la carpeta "Shared" si se quiere que puedan ser usadas desde cualquier controlador. Si no es así, se ubican en su carpeta específica.

    En cuanto al paso de datos, la vista parcial "ve" el mismo Modelo que la vista principal que la incluye. Por lo tanto, puedes encapsular los datos que quieras pasarle dentro de dicho modelo. Alternativamente, puedes introducir los datos en el ViewData (como ya estás haciendo).

    Como alternativa a las vistas parciales, podrías definir dentro de tu código un "helper" de Html (al fin y al cabo no es más que una función dentro de una clase, que devuelve un HtmlString) y luego "incrustarlo" dentro de otra vista mediante <%=MiClase.MiHelper(parametros)%>.

    Hola Alberto muchas gracias

    Efectivamente logre hacerlo con una vista de esas, lo unico que no pude fue lo del "helper" asi que tuve que hacerlo de una forma como explican en este link

    http://geeks.ms/blogs/etomas/archive/2011/02/25/rendering-de-vistas-parciales-en-razor-y-mvc3.aspx

    El unico problema fue que como no dispongo de VS 2010 si no 2008 no pude usar eso que se llama Razor por lo que tuve que usar un ViewData. Leyendo un poco me encontre como que Razor salio en MVC 3 y que aparentemente es mejor "y a nivel de código parece mas simple" que el ViewData. Aprovecho para preguntarte, deberia descartar 100% el ViewData y usar Raizor cuando trabaje con VS 2010? ¿Si, no y por que?

    Anexo mi código por si a alguien le sirve.

    - Controlador

    public class DataController : Controller
        {
            public ActionResult Repeater()
            {
                ViewData["Data"] = ObtenerData();
                return View();
            }
            public ActionResult ViewPartial()
            {
                ViewData["Data"] = ObtenerData();
                return View();
            }
            List<UserEntity> ObtenerData(){ }
        }
        public class UserEntity
        {
            public string Nombre { get; set; }
            public int Edad { get; set; }
            public DateTime Fecha { get; set; }
        }

    Vista Parcial

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<List<FirstMvc.Controllers.UserEntity>>" %>
    <h1>Vista Parcial</h1>
    <ul>
    <% foreach(var data in Model)
        {%>
            <li><%= data.Nombre %>, edad <%= data.Edad %>. Fecha de registro <%= ((DateTime)data.Fecha).ToString("dd/MM/yyyy") %></li>
        <%}
    %>
    </ul>

    Vista

    <% Html.RenderPartial("VP1", ViewData["Data"]); %>

    Gracias

    viernes, 28 de diciembre de 2012 18:28
  • deberia descartar 100% el ViewData y usar Raizor cuando trabaje con VS 2010?

    A ver, no nos liemos: no tiene nada que ver una cosa con la otra. El ViewData se puede usar tanto desde el motor de vistas Razor como desde el motor de vistas Aspx. De hecho, se pueden incluso usar vistas con ambos motores dentro del mismo proyecto, y se pueden pasar datos a ambas dentro del ViewData.

    Adicionalmente, en MVC3 se introdujo el ViewBag, que simplemente consiste en una sintaxis distinta para hacer lo mismo que hace el ViewData. Sigue siendo compatible tanto con el motor Razor como con el motor Aspx.

    Si la pregunta se refiere a si es mejor usar el motor Razor o el Aspx, mi opinión es que sí, que el Razor es mejor. Pero solo desde el punto de vista de que el código es más sencillo de escribir y de leer que el aspx. En cuanto a funcionalidad, los dos motores tienen la misma. Tanto uno como el otro soportan vistas parciales, ViewData/ViewBag y Helpers.

    • Marcado como respuesta AdyIr domingo, 6 de enero de 2013 6:11
    viernes, 28 de diciembre de 2012 19:06
  • deberia descartar 100% el ViewData y usar Raizor cuando trabaje con VS 2010?

    A ver, no nos liemos: no tiene nada que ver una cosa con la otra. El ViewData se puede usar tanto desde el motor de vistas Razor como desde el motor de vistas Aspx. De hecho, se pueden incluso usar vistas con ambos motores dentro del mismo proyecto, y se pueden pasar datos a ambas dentro del ViewData.

    Adicionalmente, en MVC3 se introdujo el ViewBag, que simplemente consiste en una sintaxis distinta para hacer lo mismo que hace el ViewData. Sigue siendo compatible tanto con el motor Razor como con el motor Aspx.

    Si la pregunta se refiere a si es mejor usar el motor Razor o el Aspx, mi opinión es que sí, que el Razor es mejor. Pero solo desde el punto de vista de que el código es más sencillo de escribir y de leer que el aspx. En cuanto a funcionalidad, los dos motores tienen la misma. Tanto uno como el otro soportan vistas parciales, ViewData/ViewBag y Helpers.


    Hola, muchas gracias por la información... No me habia dado cuenta que no habia marcado la respuesta
    domingo, 6 de enero de 2013 6:14