2009-07-08 27 views
12

Tengo una vista que se compone de encabezados superiores, izquierdos e inferiores y un panel de contenido principal. Supongamos que durante una solicitud AJAX necesito actualizar el HTML de los paneles superior, inferior y principal (el encabezado izquierdo debe permanecer igual).ASP.NET MVC y AJAX

Me preguntaba cuál sería la mejor manera de lograr esto. Lo primero que se pensó fue poner el panel de contenido principal en un parcial y tener una acción de controlador que devuelva PartialView. Esto no funcionaría porque como la acción solo devuelve el HTML del panel principal, no puedo actualizar los encabezados superiores e inferiores.

Así que si pongo los encabezados superior e inferior en sus respectivas vistas parciales, necesitaría mi acción de controlador para devolver múltiples vistas parciales. ¿Es esto posible o estoy haciendo algo completamente fuera de la pista?

Vi que es posible render a partial view to a string así que pensé que podría usar esta técnica en la acción para devolver un objeto JSON con 3 propiedades que representan el HTML de los 3 parciales que necesito actualizar. Pero, de ser posible, se siente como un enfoque muy equivocado para mí.

Otra idea que tuve fue devolver un objeto JSON que solo contenía los datos necesarios para los parciales y usar javascript para construir el HTML. Pero construir una IU en javascript parece un trabajo difícil (El contenido principal parcial usa GridView de MvcContrib con paginación y clasificación).

Así que realmente agradecería sugerencias sobre cuál sería el enfoque más limpio para manejar dicho escenario. También una solución adaptable sería genial: por ejemplo, si el usuario tiene desactivada la javascript , simplemente volvería a cargar toda la página sin AJAX.


UPDATE:

Andrew Siemersuggested colocando cada sección en su propia vista parcial y realizar múltiples peticiones Ajax. Esto parece ser un enfoque perfectamente válido, pero desafortunadamente no es aplicable en mi escenario debido a los siguientes detalles que omití en la descripción inicial del problema: el encabezado superior se usa para mostrar mensajes de error/información de eventos que ocurren en el panel principal. Entonces, por ejemplo, necesito mostrar el mensaje de error en caso de que se produzca una excepción cuando vaya a buscar el modelo para el panel principal. Por lo tanto, solo se puede realizar una única solicitud para actualizar esos dos paneles.

+0

se puede echar un vistazo a esto: http://stackoverflow.com/questions/7086440/mvc-validating-binded- to-entitiy-with-reference-to-other-entities pls (no tengo idea de cómo contactarlo directamente) :) thnx – cpoDesign

Respuesta

9

Puede colocar fácilmente cada sección en su propia vista parcial. Esto le permitiría hacer una solicitud de jquery para cada vista una vez que sus datos hayan sido enviados/modificados. Cada llamada podría ser empujada a la sección apropiada. Esto es muy factible y suena como el camino apropiado.

No esperaba que su controlador devolviera varias vistas parciales ... ¡ya que esto rompería SRP!

Actualización: al seguir con su actualización ... aún puede buscar las secciones por separado. Esto simplemente requiere un poco más de frescura ajax de tu parte, ya que cada extracción puede devolver un fragmento de error (a través de una solicitud JSON). Si aparece algún error, esos mensajes de error se pueden mostrar en el encabezado. O ... puede hacer que la solicitud de encabezado dure los errores una vez que todas las demás solicitudes hayan informado, en cuyo caso cada vista parcial puede enviar sus mensajes de error a una variable de sesión para el estado de error ... y luego mostrar esos mensajes en el encabezado

Una gran razón para elegir ir con cada sección, ya que es su propia sección en lugar de una única solicitud de Uber aún no puede ser evidente en el diseño inicial.Con cada sección controlada por separado, puede hacer cosas sofisticadas como almacenar en caché cada sección de forma independiente, proporcionando actualizaciones más frecuentes en un área sobre otra, etc.

+0

Gracias por el consejo Andrew. Lamentablemente, he omitido un detalle importante en mi descripción inicial, por lo que me temo que esta sugerencia no se puede aplicar en mi caso. He actualizado mi pregunta en consecuencia. –

0

Esto es complicado. ¿Qué tal esto?

Configure un partial request para cada componente superior, izquierdo, principal, que devuelve una vista parcial con los datos necesarios para esa área. Luego, cada vez que hay un evento en el panel principal, se inicia una actualización de los parciales en cada área para actualizarlos.

Como alternativa, tenerlos todos en temporizadores fijos para sondear los datos nuevos.

0

¿Qué le parece incluir su vista superior y derecha en divs ocultos en su vista principal y moverlos a los lugares correctos con la carga?

0

Sé que esta pregunta ha sido contestada, pero pensamos que acababa de tono en una sugerencia:

  • Backbone.js y plantillas jQuery iba a resolver sus problemas con facilidad.

(Justo a dejar esto aquí como una sugerencia para la gente que lee esta pregunta)