2009-11-02 49 views
6

我想使用ActionFilter的返回不同格式(JavaScript/XML/JSON/HTML)的控制器的Model(數據)。下面是我在哪裏至今:在控制器的ActionResult上使用ActionFilter返回JsonResult

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

而且它的實現:

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

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

    return View(entries); 
} 

OnResultExecuting方法被調用,但我沒有得到的模型(數據)返回並格式化爲JSON對象。我的控制器只呈現視圖。


更新:我遵循Darin Dimitrov的回答this question的建議。

回答

9

這正是我一直在尋找:

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

你試過:

return Json(entries); 

與JsonResult對控制器動作返回類型?

+0

IResultFilter.OnResultExecuting返回void。 Json類在這種情況下不可用。 – roosteronacid 2009-11-02 16:28:48

1

您是否嘗試過在OnActionExecuted方法中實現您的過濾器代碼,而不是OnResultExecuting?可能在後者被解僱的時候,改變結果爲時已晚(語義是「好的,我們手頭有結果,這個鉤子在這個結果執行之前就被觸發了」),但是我現在沒有時間去查看MVC源代碼。

相關問題