2009-11-02 20 views
6

ActionFilter'sを使用して、コントローラのモデル(データ)をさまざまな形式(JavaScript/XML/JSON/HTML)で返したいとします。 ActionFilterはコントローラのActionResultでActionFilterを使用してJsonResultを返します。

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オブジェクトとして返され、フォーマットされました。私のコントローラはViewをレンダリングするだけです。


アップデート:私はthis questionへダーリンディミトロフの答えの提案を以下しています。

return Json(entries); 

をコントローラのアクションにするJsonResultの戻り値の型と:

答えて

9

これは私が探していたものだった。

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

は、あなたがしようとしたことがありますか?

+0

IResultFilter.OnResultExecutingはvoidを返します。そして、そのような状況ではJsonクラスは利用できません。 – roosteronacid

1

OnResultExecutingの代わりにOnActionExecutedメソッドでフィルタコードを実装しようとしましたか?後者が解雇されるまでには、結果を変更するのは遅すぎる可能性があります(セマンティクスは、「結果は手元にあります。このフックは、ここの結果が実行される直前に発生しています」)。私は今MVCのソースを確かめるために行く時間がありません。

関連する問題