1

検索と呼ばれる部分ビューがあります。この部分的なビューを多くのビューに入れたいです。ターゲットは、検索コントローラーから入力された検索文字列を取得し、検索ビューが使用される親コントローラーに送信することです。

このようにして、検索部分ビューを汎用化し、再利用できるようにしたいと考えています。

検索コントローラー:

 [HttpPost]
    public ActionResult Index(string searchString)
    {
        var controller = RouteData.Values.First().Value.ToString(); // this gives me "Search", which i dont want.

     //here i want to take the parent controller name and redirect to that controller

        return RedirectToAction("action", "controller", new { searchString = searchString });
    }

親コントローラー名を見つけるのを手伝ってくれる人はいますか??

4

1 に答える 1

3

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 });
}

しかし、基本クラスを使用することは、この種の機能を汎用的で再利用可能にする良い方法です。

于 2013-10-22T08:45:35.753 に答える