2011-08-04 15 views
21

Necesito actualizar Múltiple de una llamada Ajax, estoy confundido en cuanto a cómo devolver estas vistas múltiples desde el método de acción del controlador.Devolución de múltiples vistas parciales de una sola acción del controlador?

+0

¿Qué está tratando de lograr? –

+0

Tengo una página con dos vistas parciales, una que muestra un gráfico y la otra una lista de elementos que está representada en un gráfico; están hechas en dos vistas parciales diferentes. Ahora, para una agrupación diferente, estos dos valores cambiarían, un trabajo obvio podría ser convertirlos en una única vista parcial que quiero evitar. Como independientemente, se pueden usar con más frecuencia en mi aplicación. – Nikshep

+0

¿Por qué no simplemente haces dos llamadas ajax? – frennky

Respuesta

42

Solo puede devolver un valor de una función, por lo que no puede devolver múltiples parciales desde un solo método de acción.
Si está intentando devolver dos modelos a una vista, cree un modelo de vista que contenga los dos modelos que desea enviar y convierta el modelo de su vista en el nuevo ViewModel. P. ej.

Su modelo de vista se vería así:

public class ChartAndListViewModel 
{ 
    public List<ChartItem> ChartItems {get; set;}; 
    public List<ListItem> ListItems {get; set;}; 
} 

A continuación, el controlador de la acción sería:

public ActionResult ChartList() 
{ 
    var model = new ChartAndListViewModel(); 
    model.ChartItems = _db.getChartItems(); 
    model.ListItems = _db.getListItems(); 

    return View(model); 
} 

Y finalmente el punto de vista sería:

@model Application.ViewModels.ChartAndListViewModel 

<h2>Blah</h2> 

@Html.RenderPartial("ChartPartialName", model.ChartItems); 

@Html.RenderPartial("ListPartialName", model.ListItems); 
14

Hay un muy buen ejemplo aquí ....
http://rhamesconsulting.com/2014/10/27/mvc-updating-multiple-partial-views-from-a-single-ajax-action/

Crear un método de ayuda a empaquetar la vista parcial ...

public static string RenderRazorViewToString(ControllerContext controllerContext, 
    string viewName, object model) 
{ 
    controllerContext.Controller.ViewData.Model = model; 

    using (var stringWriter = new StringWriter()) 
    { 
     var viewResult = ViewEngines.Engines.FindPartialView(controllerContext, viewName); 
     var viewContext = new ViewContext(controllerContext, viewResult.View, controllerContext.Controller.ViewData, controllerContext.Controller.TempData, stringWriter); 
     viewResult.View.Render(viewContext, stringWriter); 
     viewResult.ViewEngine.ReleaseView(controllerContext, viewResult.View); 
     return stringWriter.GetStringBuilder().ToString(); 
    } 
} 

Crear una acción de controlador para agrupar las múltiples vistas parciales ....

[HttpPost] 
public JsonResult GetResults(int someExampleInput) 
{ 
    MyResultsModel model = CalculateOutputData(someExampleInput); 

    var totalValuesPartialView = RenderRazorViewToString(this.ControllerContext, "_TotalValues", model.TotalValuesModel); 
    var summaryValuesPartialView = RenderRazorViewToString(this.ControllerContext, "_SummaryValues", model.SummaryValuesModel); 

    return Json(new { totalValuesPartialView, summaryValuesPartialView }); 
} 

Cada vista parcial puede utilizar su ow n modelo si es necesario o puede agruparse en el mismo modelo que en este ejemplo.

A continuación, utilice una llamada AJAX para actualizar todas las secciones de una sola vez:

$('#getResults').on('click', function() { 

    $.ajax({ 
     type: 'POST', 
     url: "/MyController/GetResults", 
     dataType: 'json', 
     data: { 
      someExampleInput: 10 
     }, 
     success: function (result) { 
      if (result != null) { 
       $("#totalValuesPartialView").html(result.totalValuesPartialView); 
       $("#summaryValuesPartialView").html(result.summaryValuesPartialView); 
      } else { 
       alert('Error getting data.'); 
      } 
     }, 
     error: function() { 
      alert('Error getting data.'); 
     } 
    }); 
}); 

Si desea utilizar este método para una petición GET, necesita eliminar el decorador [HttpPost] y añadir JsonRequestBehavior.AllowGet al producto devuelto JsonResult:

return Json(new { totalValuesPartialView, summaryValuesPartialView }, JsonRequestBehavior.AllowGet); 
+0

Solución muy elegante, muchas gracias. – markau

+0

Me gusta esta solución porque le permite devolver varias vistas parciales que no existen dentro de la misma ubicación en la página. – kerl

Cuestiones relacionadas