2009-11-02 18 views
6

Quiero devolver el Modelo (datos) de un controlador en diferentes formatos (JavaScript/XML/JSON/HTML) usando ActionFilter. Aquí es donde estoy hasta ahora:Devolver JsonResult utilizando ActionFilter en ActionResult en un controlador

El ActionFilter:

public class ResultFormatAttribute : ActionFilterAttribute, IResultFilter 
{ 
    void IResultFilter.OnResultExecuting(ResultExecutingContext context) 
    { 
     var viewResult = context.Result as ViewResult; 

     if (viewResult == null) return; 

     context.Result = new JsonResult { Data = viewResult.ViewData.Model }; 
    } 
} 

y el árbitro pita aplicación:

[ResultFormat] 
public ActionResult Entries(String format) 
{ 
    var dc = new Models.WeblogDataContext(); 

    var entries = dc.WeblogEntries.Select(e => e); 

    return View(entries); 
} 

El método OnResultExecuting es llamado, pero no estoy recibiendo el modelo (datos) devuelto y formateado como un objeto JSON. Mi controlador solo renderiza la Vista.


Actualización: estoy siguiendo la sugerencia de la respuesta de Darin Dimitrov a this question.

Respuesta

9

Esto era lo que estaba buscando:

public class ResultFormatAttribute : ActionFilterAttribute, IActionFilter 
{ 
    void IActionFilter.OnActionExecuted(ActionExecutedContext context) 
    { 
     context.Result = new JsonResult 
     { 
      Data = ((ViewResult)context.Result).ViewData.Model 
     }; 
    } 
} 
-1

Ha intentado:

return Json(entries); 

con un tipo de retorno de JsonResult en la acción del controlador?

+0

IResultFilter.OnResultExecuting regresa vacía. Y la clase Json no está disponible en ese contexto. – roosteronacid

1

¿Ha intentado implementar su código de filtro en el método OnActionExecuted, en lugar de OnResultExecuting? Es posible que para el momento en que se dispara este último, es demasiado tarde para cambiar el resultado (la semántica es, "OK, tenemos el resultado en la mano, y este gancho se dispara justo antes de que se ejecute este resultado"), pero No tengo tiempo ahora mismo para consultar la fuente de MVC para estar seguro.

Cuestiones relacionadas