2009-11-02 11 views
6

Chcę zwrócić model (dane) kontrolera w różnych formatach (JavaScript/XML/JSON/HTML) przy użyciu ActionFilter. Oto gdzie jestem na tak daleko:Powrót JsonResult przy użyciu ActionFilter w ActionResult w kontrolerze

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 }; 
    } 
} 

i wdrażanie To:

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

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

    return View(entries); 
} 

Sposób OnResultExecuting jest wywoływana, ale nie otrzymuję modelu (dane) zwrócone i sformatowane jako obiekt JSON. Mój kontroler renderuje widok.


Aktualizacja: Podążam za sugestią odpowiedzi Darina Dimitrowa na this question.

Odpowiedz

9

To było to, czego szukał:

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

Czy próbowałeś:

return Json(entries); 

z typem zwracanej JsonResult na działania kontrolera?

+0

IResultFilter.OnResultExecuting zwraca pustkę. A klasa Json nie jest dostępna w tym kontekście. – roosteronacid

1

Czy próbowałeś/aś wdrożyć swój kod filtra w metodzie OnActionExecuted zamiast OnResultExecuting? Możliwe, że do czasu, gdy ten drugi zostanie zwolniony, jest za późno, aby zmienić wynik (semantyka to "OK, mamy wynik w ręce, a ten hak to ogień tuż przed wykonaniem tego wyniku tutaj"), ale Nie mam teraz czasu, aby sprawdzić źródło MVC, żeby się upewnić.

Powiązane problemy