Rendering de vistas parciales en Razor y MVC3

Buenas! Una de las dudas que he visto que se van repitiendo por ahí tiene que ver con como renderizar vistas parciales en MVC3 usando Razor.

En MVC2 y anteriores (o en MVC3 usando el ViewEngine de WebForms) la forma de renderizar una vista parcial era sencilla:

<% Html.RenderPartial("VistaParcial", modelo); %>

Mucha gente traduce eso a Razor y usa lo siguiente para renderizar una vista parcial:

@Html.RenderPartial("VistaParcial")

Y se obtiene un error, quizá un poco críptico, que dice lo siguiente: CS1502: The best overloaded method match for ‘System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)’ has some invalid arguments

El error no está en que Html.RenderPartial no pueda usarse con Razor, el error está en la sintaxis que estamos usando. Cuando en Razor usamos la @ para indicar el inicio de código de servidor, la expresión que viene a continuación debe devolver un valor, que será incluído en la respuesta a enviar al navegador. La excepción a esa norma es cuando lo que sigue a la @ es una palabra clave reservada de Razor (como @model) o una palabra clave reservada del lenguaje que estemos usando (como @foreach). Esos casos especiales Razor los sabe tratar y actúa en consecuencia. Pero en el resto de casos siempre, siempre, siempre la expresión debe devolver un valor.

Hablando en términos del engine de WebForms, el código Razor:

@Html.RenderPartial("VistaParcial", modelo)

Se corresponde a:

<%: Html.RenderPartial("VistaParcial",modelo) %>

Que es erróneo (y da el error CS1502: The best overloaded method match for ‘System.Web.HttpUtility.HtmlEncode(string)’ has some invalid arguments).

Entonces… como usar Html.RenderPartial en Razor? Fácil: usando llaves para indicarle al motor de Razor que eso es un código que debe ejecutar, en lugar de un valor que debe incrustar en la respuesta:

@{ Html.RenderPartial("VistaParcial"); }

Así pues: Html.RenderPartial puede usarse en Razor sin ningún problema… como el resto de Helpers que conozcáis. Si el método lo usábais con <% … %> en Razor es @{ … }, mientras que si usábais <%: … %> en Razor es simplemente @…

Otras maneras de incrustar vistas parciales

De todas formas hay un par de métodos más para incrustar vistas parciales.

El primer método es Html.Partial() un método de extensión adicional. Para llamarlo se usan los mismos parámetros que Html.RenderPartial. La diferencia es que Html.Partial devuelve una IHtmlString con los contenidos de la vista renderizada. Por lo tanto, para incrustar una vista usando Html.Partial() usamos:

// Razor
@Html.Partial("VistaParcial")
// Webforms viewengine
<%: Html.Partial("VistaParcial") %>

El segundo método es propio de Razor, ya que está definido dentro del framework que se conoce como “WebPages” y es usar el método RenderPage, definido en la clase WebPageBase de la cual heredan las vistas Razor.

Dicho método acepta dos parámetros:

  1. La localización de la vista. Ojo! No el nombre, sinó su localización (incluyendo directorios)
  2. Parámetros a pasar a la vista (params object[]).

P.ej. para renderizar la vista parcial usaríamos:

@RenderPage("~/Views/Home/VistaParcial.cshtml")

Fijaos en que se debe usar el nombre del archivo de la vista a incluir (incluyendo extensión .cshtml).

Si se pasan parámetros a la vista parcial, estos no están disponibles usando la propiedad Model en la vista, sinó que debe usarse la propiedad PageData. P.ej. podríamos pasar una cadena y un entero a la vista:

@RenderPage("~/Views/Home/VistaParcial.cshtml", "Parametro 1", 10)

Y mostrarlos desde la vista con el uso de PageData:

@foreach (var item in PageData)
{
<div>@item.Value</div>
}

Mi opinión sobre el método RenderPage (en MVC): Sobra totalmente, y espero que nunca, nunca, nunca lo uséis. Porque? Pues porque RenderPage rompe la encapsulación del framework (en lugar de especificar un nombre de vista debéis especificar un fichero). Es evidente que existe para dar soporte a WebPages pero WebPages y MVC se parecen sólo porque usan Razor como sintaxis, pero en concepción son dos cosas totalmente distintas… Aunque por razones (supongo que técnicas) Razor depende de WebPages y esa dependencia se arrastra a MVC3, cosa que personalmente no me gusta demasiado. Pero es lo hay… 😉

Conclusiones

  1. Html.RenderPartial funciona correctamente en Razor, al igual que el resto de métodos de siempre. Sólo debemos tener cuidado en usar la sintaxis correcta.
  2. Html.Partial es un método adicional para renderizar vistas parciales. La diferencia con Html.RenderPartial() es que este último escribe en la response directamente el contenido de la vista, mientras que Partial() lo devuelve dentro de una cadena. No tengo claras las implicaciones de rendimiento que puede tener empezar a crear mutltiud de cadenas que serán eliminadas por el GC casi de inmediato.
  3. RenderPage es el método de WebPages para renderizar vistas parciales. Desde el punto de vista de MVC es un método que sobra totalmente y que rompe la encapsulación del framework.

Espero que os sea útil!

Un saludo!

De los requerimientos…

Mi hermano y yo ambos somos arquitectos. Aunque en su caso él tiene un título universitario que lo acredita como tal y yo sólo una tarjeta de trabajo donde mi empresa ha decidido poner eso… y en inglés que se supone que queda mejor. Los dos nos dedicamos a pensar y diseñar cosas: él piensa y diseña espacios habitables (o sea pisos y casas) y yo pienso y diseño soluciones informáticas (o sea programas).

Ayer mi hermano (que no sólo es arquitecto, sinó que regenta una empresa de obras) me vino riéndose por una petición de presupuesto en broma que había recibido. El correo electrónico decía, más o menos, así…

Apreciado hermano de eiximenis,

Nos dirigimos a Ud. para que nos haga un presupuesto para la construcción de una nueva mansión para un concejal cualquiera (a partir de ahora “el cliente”) que, con un golpe de fortuna, ha ganado unos dinerillos que gastar. A continuación le detallamos como debe la mansión:

  1. La mansión contará con el número de habitaciones que el cliente estime cómo necesarias para el desarrollo de sus funciones de descanso y/o copulación. Además el cliente debe poder realizar otras funciones (a especificar en algún momento del futuro) sin menoscabo de la comodidad mínima exigida.
  2. Los materiales de construcción deben tener el nivel de calidad requerido por el cliente, nivel que por supuesto no aparece en ningún estándard y que sólo el cliente conoce y que puede variar en función de su estado de ánimo.
  3. Deberán integrarse, adaptarse o construirse distintos módulos de diversión, para aquellas actividades de ocio que el cliente considere necesarias. No es necesario especificar que las necesidades de ocio del cliente pueden variar en cualquier momento durante el periodo de tres años que se exige como mantenimiento.
  4. El número de baños deberá ser el justo y necesario para que pueda usarlos el cliente, así como los invitados a sus fiestas. El número de invitados no ha sido proporcionado por el cliente.
  5. Se valorará positivamente que los garajes estén listos al cabo de dos semanas y más positivamente si lo están al cabo de una.
  6. El cliente ha comprado un módulo de domótica que deberá ser instalado y configurado. El modelo es desconocido al igual que el fabricante.
  7. Existe un periodo de tres años de garantía, donde el cliente puede solicitar cambios en los materiales, disposición de los módulos, módulos de ocio nuevos, etc, etc

Dado que el cliente es un concejal debe asignar la obra de forma totalmente legal y por ello se deberán entregar tres sobres:

  1. El primero con la propuesta económica final. Dicha propuesta contendrá el precio exacto de la obra, incluyendo materiales y mano de obra y mantenimiento durante los 3 años. El mantenimiento implica adaptar la mansión a las nuevas necesidades que le puedan surgir al cliente. Hay total libertad de precio, siempre que no pase de 500000€
  2. El segundo con el calendario exacto de las obras: cuando estará el garaje, las distintas habitaciones, la fachada principal, los módulos de ocio, etc. El inclumpimiento del calendario acarreará sanciones económicas a determinar.
  3. El tercero con los detalles técnicos, planos de obra, materiales usados, etc

La valoración por concurso será tal y como sigue:

  1. Valoración económica: Un 50% (De 0 a 5 puntos)
  2. Calendario: Un 40% (de 0 a 4 puntos)
  3. Detalles técnicos: Un 10% (de 0 a 1 punto)

Se pide envío de los tres sobres antes de 2 días. El cliente no está disponible para contactar ya que está de vacaciones.

Mi hermano entre carcajadas y carcajada, me insistía en que le viera la gracia a la broma, que si “fíjate que aquí no concretan nada, que si eso es buenísimo porque ni dicen el número de las habitaciones, en que si tal y cual”…

… yo, la verdad es que sonreí un poco por compromiso mientras por dentro pensaba en las muchas veces que mi trabajo parece una broma… y de mal gusto.

Saludos!

[Material] WebCast ASP.NET MVC

Buenas.

Este post simplemente es para agradeceros a todos el interés que mostrasteis en el Webcast de ASP.NET MVC que tuve el placer de realizar para la gente del Lledia DotNetClub.

Antes que nada os dejo la página desde donde os podéis ver o descargaros el WebCast: https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=es-ES&EventID=1032476809&CountryCode=ES. En esa página veréis un enlace que pone “Regístrese sin cuenta de Windows Live ID” que es el que os llevará a la página de descarga.

Increíble, eh? Esta vez no la pifié con el livemeeting y quedó grabado! 🙂

Os dejo:

  1. El código fuente de Porrazo completo. Porrazo, el sistema de porras on-line, fue lo que más o menos fuimos desarrollando a lo largo de los dos webcasts. En el código veréis implementadas todas las técnicas de las que hablamos (con la excepción del helper WebGrid). Por supuesto que Porrazo es un conglomerado de técnicas de hacer las cosas: no significa que todas deban implementarse en una misma aplicación MVC. A vosotros os toca juzgar en cada caso cual es la mejor opción!
  2. Los dos ppts, aunqué no tienen apenas información, ya que son un mero índice.
  3. El script SQL para crear las tablas (sin datos… los datos deberéis ponerlos vosotros… :p).

Lo tenéis en: http://cid-6521c259e9b1bec6.office.live.com/browse.aspx/BurbujasNet/ZipsPosts/Porrazo

En breve me gustaría hacer un documento word (en esa misma carpeta) para que podáis realizar step-by-step Porrazo desde cero y podáis practicar las técnicas que vimos. Pero como ello me va a llevar cierto tiempo, prefiero dejaros los fuentes ya disponibles, y actualizar este post cuando tenga el documento realizado.

Si alquien quiere que le avise personalmente cuando tenga el documento, puede enviarme un mail (mi correo está en los ppts) o contactar conmigo a través del formulario de contacto del blog.

Muchas gracias!

Actualización 09/02: He dejado otro fichero .sql (Porrazo_tablas_con_datos.sql) en la carpeta de skydrive que crea las tablas (como el script Porrazo_tablas.sql) pero además añade los mismos datos que tengo yo en mi bbdd. De esa manera ya tendréis una bbdd lista para usar. Recordad que ninguno de los dos scripts crea la bbdd (Porrazo).

[WebCast] ¿Te quedaste con más ganas? ASP.NET MVC II

Muy buenas! Este jueves 03 de febrero (o sea mañana) gracias a la gente del Lleida dotnet club, tengo el gusto de dar un WebCast sobre ASP.NET MVC 🙂

La verdad es que el WebCast está pensado para ser la continuación del que dí el pasado 2 de diciembre. En aquel webcast vimos:

  1. Introducción a ASP.NET MVC
  2. Membership providers para autenticación y autorización
  3. Uso de Unity para desacoplar dependencias
  4. El patrón repositorio para acceder a la BBDD
  5. Uso de Ajax con Json
  6. Templates con jquery-tmpl
  7. Binding de datos en los controladores
  8. Guardando datos en la bbdd: Unit of Work

Todo ello lo vimos desarrollando una aplicación desde cero (al que mi departamento de marketing llamó Porrazo), y este nuevo webcast continuará donde se quedó aquel. Lamentablemente, debido a que soy un negado en eso del livemeeting el webcast no quedó grabado, así que al principio vamos a dar un rápido resumen a lo visto en aquel webcast, para que estemos todos en situación… Y luego proseguiremos con los puntos que se nos quedaron en el tintero:

  1. Uso de un Role Provider
  2. Añadiendo un módulo de administración (áreas)
  3. Componiendo presentación (uso de vistas parciales)
  4. Grids!! (Sí… esa es una feature que la gente pide mucho)
  5. Ventanas flotantes (popups)

Si me da tiempo (espero no volver a enrollarme) veremos algunos temas addicionales como:

  1. Validación de datos en cliente
  2. Unobtrusive javascript

Y al final una sesión de preguntas y respuestas (pero… no os paséis: que sean facilitas, eh? ;-))

Todo ello con ASP.NET MVC3, con VS2010 a tope (nada de power points!) y desarrollando Porrazo, el sistema de porras online que cuando esté finalizado colgaré aquí con la esperanza de que lo compre Google y me retire.

La página de registro esá en: https://msevents.microsoft.com/CUI/Register.aspx?culture=es-ES&EventID=1032476808&CountryCode=ES&IsRedirect=false

Un saludo a todos!