2012-02-09 8 views
6

を使用せずに、コントローラ間の見解を共有することは、私が学生のための検索機能を提供し、コントローラを持っているとしましょう:は、共有フォルダ

public class StudentSearchController 
{ 
    [HttpGet] 
    public ActionResult Search(StudentSearchResultModel model) 
    { 
     return View(model); 
    } 
} 

限り検索アクションがStudentSearchResultModelを提供するよう、それはのリストをレンダリングしますの検索結果。

このアクション方法を効果的に拡張する方法はありますか他のコントローラから

public class UniStudentController 
{ 
    [HttpPost] 
    public ActionResult Search(UniStudentSearchResultModel model) 
    { 
     return RedirectToAction("Search", "StudentSearch", model); 
    } 
} 

public class HighSchoolStudentController 
{ 
    [HttpPost] 
    public ActionResult Search(HighSchoolSearchResultModel model) 
    { 
     return RedirectToAction("Search", "StudentSearch", model); 
    } 
} 

(両方のモデルがStudentSearchResultModelを拡張仮定。)

私は明らかにこれを行うことはできません、私ので、たとえば、私はこのような学生のために検索する必要がある他のコントローラを持つようにしたいと言うことができますプリインスタンス化されたモデルクラスを検索コントローラに渡すことはできません(元の検索コントローラは、渡されたモデルを使用するのではなく、StudentSearchResultModelを再作成します)。

これまでのところ、SearchView.cshtmlを「Shared」フォルダに移動すると、Uni/HighSchoolコントローラから直接ビューをレンダリングできます(「RedirectToAction」ではなく)。 。それはうまく動作し、理論的に私はStudentSearchControllerをまったく必要としません。しかし、私はここでレガシーコードを構築しています(この人為的な例では、StudentSearchControllerは従来のものです)、リファクタリングのボットロードをせずに、 "Shared"フォルダは私の選択肢ではありません。

もう一つの解決策は、すべての検索関連のアクションをStudentSearchControllerに入れることです。そうすれば、UniStudentSearchとHighSchoolStudentSearchの2つのアクションが得られます。私はこのアプローチが嫌いです。それは、StudentSearchControllerがすべての目的の用途のを知る必要があることを意味するためです。

アイデア?

PS:リファクタリングには反対ではありませんが、締め切り日は限られています。

答えて

5

あなたは

return View("~/Views/StudentSearch/SearchView.cshtml", model); 
+0

真)ビュー(への呼び出しでビューのパスを置くことができます。 SearchViewは他のビュー(@ Html.Partial( "Controls/Student")など)に依存していますが、このアプローチをとると見つからない場合があります。 – gerrod

+0

このようにSearchViewを複数のコントローラで共有したいと考えると、ビュー内のこれらの呼び出しもより正確にする必要があります。 @ Html.Partial( "〜/ Controls/Student") –

関連する問題