2009-11-02 5 views
6

Ich möchte das Modell (Daten) eines Controllers in verschiedenen Formaten (JavaScript/XML/JSON/HTML) mit ActionFilter. Hier ist, wo ich so weit bin:Rückgabe JsonResult mit einem ActionFilter auf einem ActionResult in einem Controller

Die Action:

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

Und die es Implementierung:

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

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

    return View(entries); 
} 

Die OnResultExecuting Methode aufgerufen wird, aber ich bin nicht das Modell (Daten bekommen) zurückgegeben und als JSON-Objekt formatiert. Mein Controller rendert nur die Ansicht.


Update: Ich bin nach dem Vorschlag von Darin Dimitrov Antwort auf this question.

Antwort

9

Das war, was ich suchte:

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

Haben Sie versucht:

return Json(entries); 

mit dem Rückgabetyp JsonResult auf der Controller-Aktion?

+0

IResultFilter.OnResultExecuting Void zurückgibt. Und die Json-Klasse ist in diesem Kontext nicht verfügbar. – roosteronacid

1

Haben Sie versucht, Ihren Filtercode in der OnActionExecuted-Methode anstelle von OnResultExecuting zu implementieren? Es ist möglich, dass es zu spät ist, um das Ergebnis zu ändern (die Semantik ist, "OK, wir haben das Ergebnis in der Hand, und dieser Haken ist Feuer, bevor dieses Ergebnis hier ausgeführt wird"), aber Momentan habe ich keine Zeit, die MVC-Quelle zu überprüfen.

Verwandte Themen