2009-07-05 1 views
2

コントローラメソッドが穏やかに呼び出され、JavaScriptを介して呼び出された場合、JsonResultを返す場合、ビューを返すことは可能ですか? 私は私の見解を実現する自由を持ちたいと思っていますが、私は2つのコントローラメソッドを作成せずに、このようにしたいと考えています。asp MVC:コントローラーメソッドの呼び出し方法を決定できますか?

のは、私がブラウザでwww.example.com/person/get?id=232に入力するとしましょうならば、私は次のような何かをするGet(int id)方法たい:

 
    
     public ActionResult Get(int id) 
     { 
      Person somePerson = _repository.GetPerson(id); 
      ViewData.Add("Person", somePerson); 
      return View("Get"); 
     } 
 

しかし、のは、この同じコントローラメソッドはjQueryを経由して呼び出されたとしましょう場合:

 
    
     //controller method called asynchronously via jQuery 
     function GetPerson(id){ 
      $.getJSON(
       "www.example.com/person/get", //url 
       { id: 232 }, //parameters 
       function(data) 
       { 
        alert(data.FirstName); 
       } //function to call OnComplete 
      ); 
     } 
 

私はそれが次のように行動したいと思う:

 
    
     public JsonResult Get(int id) 
     { 
      Person somePerson = _repository.GetPerson(id); 
      return Json(somePerson); 
     } 
 

答えて

4

私はそれを理解しました。上記の特定のシナリオでは、私が行うことができます。

 
    
     if(Request.IsAjaxRequest()) 
     { 
      return Json(someObject); 
     } 
     else 
     { 
      ViewData.Add("SomeObject", someObject); 
      return View("Get"); 
     } 
 

私は今、この問題へのより多くの「エレガント」ソリューションの作業を開始することができます....> _ <

+0

あなたが別のアクションメソッド –

+0

で同じ機能を使用できるように私の答えにIsAjax属性を使用することをお勧めしますブール値テストを、ViewDataオブジェクトをパラメータとして取り込む戦略パターンにカプセル化する予定です。戦略クラスの実装では、Request.IsAjaxRequest()をチェックし、ViewまたはJsonを返します。私はクラスの再利用可能性を取得し、Jsonのアプローチのための追加のメソッドを書くことから私を節約します。リポジトリから取得するロジックは2つの方法で共有されていますが、私はそれを(もちろん)複製したくありません。私はそれを周り遊び、あなたに知らせるでしょう。 – Amir

4

あなたはActionMethodSelectorを使用してこれを行うことができます属性。
まず、このようなあなたの属性を作成します。

public class IsAjaxRequest :ActionMethodSelectorAttribute 
    { 
     public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) 
     { 
      return controllerContext.HttpContext.Request.IsAjaxRequest(); 
     } 

    } 

そして、それを使用する:

public ActionResult Get(int id) 
{ 
      Person somePerson = _repository.GetPerson(id); 
      ViewData.Add("Person", somePerson); 
      return View("Get"); 
} 


[IsAjaxRequest] 
[ActionName("Get")] 
public ActionResult Get_Ajax(int id) 
{ 
     Person somePerson = _repository.GetPerson(id); 
     return Json(somePerson); 

} 
+0

マルワンにはうれしいです、ありがとう。私はおそらく次の行に沿って何かをするでしょう:return _viewStrategy.Resolve(Request、someObject); – Amir

関連する問題