SearchController を用意する代わりに、コントローラーの基本クラスを作成し、それらの間で共有されるコードを記述できます。機能が複数のコントローラーで必要な場合は理にかなっています。
コントローラーの基本クラスがあるとしましょう:
public class BaseController : Controller
{
[HttpPost]
public ActionResult Search(string searchString)
{
// ... some process
return RedirectToAction("SomeAction", new { searchString = searchString });
}
public virtual ActionResult SomeAction(string searchString)
{
// ... some other process
}
}
次に、特定のコントローラー:
public class MyController : BaseController
{
public override ActionResult SomeAction(string searchString)
{
// ... again some process
}
// .. some other actions
}
パーシャルビューの「検索」は、「SearchController」の代わりに現在のコントローラーをターゲットにするため (ビューでコントローラー名を指定しないことにより)、RedirectToAction もそのコントローラーのアクションにリダイレクトされ、名前を取得する必要はありません (そのため、コントローラーはありません)。上記のコードスニッパーの名前)。
仮想メソッドを使用する代わりに、現在のコントローラーに応じて別の名前を付ける必要がある場合は、文字列変数をアクション名として渡すこともできます (searchString パラメーターに沿って別のパラメーターになる可能性があります)。
public class BaseController : Controller
{
[HttpPost]
public ActionResult Search(string searchString, string targetAction)
{
// ... some process
return RedirectToAction(targetAction, new { searchString = searchString });
}
}
基本クラスを使用したくない場合は、検索機能をトリガーする前に、常にビューで現在のコントローラー名を取得できます。
@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString()
コントローラーでは、次のようになります。
[HttpPost]
public ActionResult Search(string searchString, string controllerName)
{
// ... some process
return RedirectToAction("action", controllerName, new { searchString = searchString });
}
しかし、基本クラスを使用することは、この種の機能を汎用的で再利用可能にする良い方法です。