1

コントローラーのアクションで、同じコントローラーの別のアクションを実行する必要があります。どちらのアクションも同じセキュリティ コンテキストにあります。RedirectAction を呼び出して他のアクションを実行する必要がありますか? それとも、両方のアクションが呼び出せる共有メソッドを作成する必要がありますか?

RedirectAction の使用例:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Search(string value)
{
   IPresenter presenter = new Presenter();
   List<Item> items = presenter.GetList(value);

   if (items.Count > 1)
      return base.View("List", items);
   else
      return base.RedirectAction("Detail", new { id = items.First().Id });
}

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Detail(int id)
{
   IPresenter presenter = new Presenter();

   return base.View(presenter.GetItemById(id));
}

そして、共有メソッドを使用した例:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Search(string value)
{
   IPresenter presenter = new Presenter();
   List<Item> items = presenter.GetList(value);

   if (items.Count > 1)
      return base.View("List", items);
   else
      return this.GetDetail(id);
}

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Detail(int id)
{
   return this.GetDetail(id);
}

private ActionResult GetDetail(int id)
{
    IPresenter presenter = new Presenter();

    return base.View(presenter.GetItemById(id));
}

共有メソッドの場合、RedirectAction の場合よりも http 要求が 1 つ少なくなりますが、RedirectAction を使用すると、Asp.Net MVC の方法でより自然なフローになります。

どのケースが最適だと思いますか?その理由は? そして、状況に応じて両方が良い場合、良い状況と悪い状況は何ですか?

注: この場合、ブラウザの [戻る] ボタンを使用しているときに複数の投稿がサーバーに送信される可能性があるクライアントへの望ましくない動作を防ぐために、 PRG パターンが不可欠であることを知っているため、意図的に投稿クエリを使用しません。

どうもありがとうございました。

4

3 に答える 3

1

これは良い質問です。

正確な答えが100%わからない場合でも、アプリケーションでは「共有メソッド」アプローチを使用しています。その理由は-単純さです。

同時に、それRedirectToActionがよりASP.NETMVCの方法であることに正しく気づきました。

あなたが投稿したような状況では、私はそのような振る舞いをまったく避けます。ユーザーがアイテムの「リスト」を要求した場合、コレクションにアイテムが1つしかない場合でも、リストを表示する必要があります。彼が詳細を確認することを決定した場合、彼はそれをクリックします。したがって、単純なコントローラーアクションとクリーンなビューがあります。

于 2012-07-24T06:25:04.867 に答える
1

あなたが言うように、共有メソッドを作成する必要があると思います。これを行うRedirectToActionと、Web サーバーへの新しい要求が発生します。

于 2012-07-24T06:27:04.540 に答える
0

うーん、別のビューを実際に返す必要があるかもしれません。フェ:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Search(string value)
{
    IPresenter presenter = new Presenter();
    List<Item> items = presenter.GetList(value);

    if (items.Count > 1)
    {
        return base.View("List", items);
    }  
    else
    {
        //your logic and model from Detail Action f.e:
        var model = repository.GetDetailModel(items.First().Id);

        return View("Detail", model);
    }
}
于 2012-07-24T11:47:51.417 に答える