2012-03-29 10 views
3

コントローラのアクションをより柔軟にしたいと考えています。例えば、Ajaxの場合、Ajaxリクエストをチェックし、ASP.NET MVCでJsonの結果を返す良い方法

... 
return View("someView"); 

のか:私は、一般的なアクションは通常返すことを意味

... 
return Json(new {result="ok"}); 

は、私が欲しいのは、私のアクションより「多目的」を作ることです。たとえば、単純な非Ajax要求に基づいてUIレイヤーを作成した後、ユーザーフレンドリーにし、Ajaxを追加することにしました。そうすれば、私はJsonを返すためのアクションを少し修正する必要があります。

(そしておそらく最悪の)そのようなことを回避する方法は、すべての(またはほとんどすべて)に次のコードを記述することで、ほとんどの最も簡単な解決方法:

if (Request.IsAjaxRequest) { 
    return Json(new {result="ok"}); 
} 
else { 
    return View("someView") 
} 

しかし、もちろん、このような方法のDRYの原則と完全に競合。

だから私は「multipurposing」ことを達成するための良い方法を見つけたいです。 「

return CheckForAjax(View(...)); 

または

return CheckForAjax(View(...), Json(new {myCustomJson="hi"}); 

しかし、私はドン:

public ActionResult CheckForAjax(ActionResult result) 
{ 
    return ActionResult(result, Json(new {result="ok"})); 
} 

public ActionResult CheckForAjax(ActionResult result, Json json) 
{ 
    if (Request.IsAjaxRequest) { 
    return json; 
    } 
    else { 
    return result; 
    } 
} 

このような方法は、私はアクションでヘルパーを呼び出すことができます。

一つの方法は、そのようないくつかのヘルパーメソッドを書くことですそれが良い方法か、いくつかの自転車を改革するかどうかは分かりません:) アクションフィーうんざりする?しかし、私はそのフィルタにカスタムJSONを渡す方法がわからない...

は正直に言うとどんな提案を

+1

オリジナルのソリューションは、**明示的な**の方が優れています。 – Ryan

答えて

6

をありがとう、私はあなたの元の溶液は大丈夫だと思い、そしてあなたの目は、違反の詳細です最初のものよりDRYのもの。 2番目のソリューションは非常に冗長で、簡単に処理できる2つの方法を提供します。

これは貧弱なスタイルだけでなく、保守性の問題です。 1つの目的に2つの機能を持たせることで、変更があるたびに両方の機能を更新する必要があります。なぜそれをやっているのかはあまり明確ではないので、他の開発者がコードを維持することが難しくなります。

あなたは私に言わせれば、KISS DRY(自分を繰り返さない)よりも重要である(それは愚かなシンプルに保ちます)。あなたのコードが簡単に理解できれば、それは良いコードです。

+0

おそらくあなたは正しいです、ありがとう:) – kasitan

2

あなたは、このようなことを行動から同じモデル、返す場合:あなたは簡単にこれを行うためのActionFilterを書くことができ

var model = new {result="ok"} 
if (Request.IsAjaxRequest) { 
    return Json(model); 
} 
else { 
    return View("someView", model) 
} 

を。例:

protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     base.OnActionExecuted(filterContext); 

     if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      var res = filterContext.Result as ViewResultBase; 
      if (res == null) { return; } 


      var jres = new JsonNetResult(); 
      jres.SerializerSettings.Converters.Add(new IsoDateTimeConverter()); 
      jres.Data = res.ViewData.Model; 
      filterContext.Result = jres; 
     } 
    } 

このメソッドは、アクションから同じモデルを返すことを意味します。ビュー内の結果オブジェクトを「標準」リクエストで消費するかどうかは、あなた次第です。

関連する問題