パラメータ付きのRedirectToAction


596

私は、私は以下のようなものをアンカーから呼び出すアクション、持っているが。Site/Controller/Action/IDIDint

後で、コントローラからこの同じアクションにリダイレクトする必要があります。

これを行う賢い方法はありますか?現在私はtempdata IDを隠していますが、f5を押して戻った後でページを更新すると、tempdataが消えてページがクラッシュします。

回答:


946

RedirectToAction()メソッドのrouteValuesパラメータの一部としてIDを渡すことができます。

return RedirectToAction("Action", new { id = 99 });

これにより、Site / Controller / Action / 99にリダイレクトされます。一時または任意の種類のビューデータは必要ありません。


2
とにかくそれまたは同様の何かをするだけでなく、コントローラを指定することはありますか?(私は1つのコントローラーから他のコントローラーのアクションにそれを行う必要があります)。
ディエゴ

18
@ディエゴ:はい、そのためのオーバーロードがいくつかあります。私の例では、RedirectToAction( "Action"、 "Controller"、new {id = 99})msdn.microsoft.com/en-us/library/dd470154.aspx
Kurt Schindler

10
VB -Return RedirectToAction("Action", "Controller", New With {.id = 99})
ジェレミーA.西

同じことをする方法はありますが、URLをそのように更新しませんか?
価値がある7

@KurtSchindlerとにかく答えを更新して、別のコントローラーへのリダイレクトのコメント例も含めますか?コメントを読み飛ばしてしまう人を助けるため。
エドワード

194

カートの答えは私の研究から正しいはずですが、私が試したとき、実際に機能させるためにこれを行わなければなりませんでした:

return RedirectToAction( "Main", new RouteValueDictionary( 
    new { controller = controllerName, action = "Main", Id = Id } ) );

コントローラとアクションを指定しなかった場合、機能RouteValueDictionaryしませんでした。

また、このようにコーディングすると、最初のパラメーター(アクション)は無視されるようです。したがって、Dictでコントローラーを指定するだけで、最初のパラメーターでActionを指定することを期待している場合、それも機能しません。

後で問題が発生する場合は、最初にカートの答えを試してください。それでも問題が解決しない場合は、これを試してください。


6
すばらしい答えです。また、controllerリダイレクトアクションがリダイレクト元のアクションと同じコントローラーにある場合、パラメーターはオプションであると思います。
im1dermike 2014年

1
それはそうであるはずですが、私がそのようにしたとき、それは機能しませんでした、私は明示的にコントローラーを追加しなければなりませんでした...調べるべきルーティング設定の問題がありました。
エリックブラウン-2014年

変だ。MVC4で動作します。
im1dermike 2014年

これはMVC1日後に起こりましたが、他の人には問題なく機能したため、振り返ってみると、構成の問題が疑われます。
エリックブラウン-

@ EricBrown-Calコメントに自分で投稿したとしても、カートの回答は、最初の頃と同じ問題への回答を求める方により適していると思いませんか?
エドワード

62

RedirectToAction パラメータ付き:

return RedirectToAction("Action","controller", new {@id=id});

1
うまくいきますか?これは間違った構文だと思います。私が間違っていたら訂正してください。
Mohammed Zameer 2015

1
@ pb2q new {id = id}は、フレームワークが参照している変数を認識しているため、同様に機能します。
エドワード

61

また、複数のパラメーターを渡すことができることにも注意してください。idはURLの一部を構成するために使用され、その他は?の後にパラメーターとして渡されます。URLにあり、デフォルトでUrlEncodedになります。

例えば

return RedirectToAction("ACTION", "CONTROLLER", new {
           id = 99, otherParam = "Something", anotherParam = "OtherStuff" 
       });

したがって、URLは次のようになります。

    /CONTROLLER/ACTION/99?otherParam=Something&anotherParam=OtherStuff

これらは、コントローラーによって参照できます。

public ActionResult ACTION(string id, string otherParam, string anotherParam) {
   // Your code
          }


39

MVC 4の例...

IDという名前のパラメーターを常に渡す必要はありません。

var message = model.UserName + " - thanks for taking yourtime to register on our glorious site. ";
return RedirectToAction("ThankYou", "Account", new { whatever = message });

そして、

public ActionResult ThankYou(string whatever) {
        ViewBag.message = whatever;
        return View();
} 

もちろん、必要に応じて、ViewBagを使用する代わりに、モデルフィールドに文字列を割り当てることができます。



21
RedirectToAction("Action", "Controller" ,new { id });

私のために働いた、する必要はなかった new{id = id}

同じコントローラー内にリダイレクトしていたので、必要はありませんでした"Controller"が、コントローラーがパラメーターとして必要な場合の背後にある特定のロジックがわかりません。


RedirectToAction("Action", "Controller", new { id = id});Core 3.1アプリで必要なものでした。
オレンジキャタピラー

18

エラーメッセージを表示したい場合は、[httppost]次のようにしてIDを渡してみてください。

return RedirectToAction("LogIn", "Security", new { @errorId = 1 });

このような詳細について

 public ActionResult LogIn(int? errorId)
        {
            if (errorId > 0)
            {
                ViewBag.Error = "UserName Or Password Invalid !";
            }
            return View();
        }

[Httppost]
public ActionResult LogIn(FormCollection form)
        {
            string user= form["UserId"];
            string password = form["Password"];
            if (user == "admin" && password == "123")
            {
               return RedirectToAction("Index", "Admin");
            }
            else
            {
                return RedirectToAction("LogIn", "Security", new { @errorId = 1 });
            }
}

それがうまくいくことを願っています。


16

....

int parameter = Convert.ToInt32(Session["Id"].ToString());

....

return RedirectToAction("ActionName", new { Id = parameter });

15

私もこの問題を抱えていました。同じコントローラ内にいる場合は、名前付きパラメータを使用するのが非常に良い方法です。

return RedirectToAction(actionName: "Action", routeValues: new { id = 99 });

7

これは数年前かもしれませんが、とにかく、必要に応じてパラメータを追加または編集できるため、Global.asaxマップルートにも依存します。

例えば。

Global.asax

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            //new { controller = "Home", action = "Index", id = UrlParameter.Optional 
            new { controller = "Home", action = "Index", id = UrlParameter.Optional,
                  extraParam = UrlParameter.Optional // extra parameter you might need
        });
    }

次に、渡す必要があるパラメーターは次のように変わります。

return RedirectToAction( "Main", new RouteValueDictionary( 
    new { controller = controllerName, action = "Main", Id = Id, extraParam = someVariable } ) );

7

コントローラの外のアクションにリダイレクトする必要がある場合、これは機能します。

return RedirectToAction("ACTION", "CONTROLLER", new { id = 99 });

1

以下はasp.netコア2.1で成功しました。それは他の場所にも当てはまるかもしれません。辞書ControllerBase.ControllerContext.RouteData.Valuesは、アクションメソッド内から直接アクセスおよび書き込み可能です。おそらく、これが他のソリューションのデータの最終的な宛先です。また、デフォルトのルーティングデータの取得元も示します。

[Route("/to/{email?}")]
public IActionResult ToAction(string email)
{
    return View("To", email);
}
[Route("/from")]
public IActionResult FromAction()
{
    ControllerContext.RouteData.Values.Add("email", "mike@myemail.com");
    return RedirectToAction(nameof(ToAction));
         // will redirect to /to/mike@myemail.com
}
[Route("/FromAnother/{email?}")]`
public IActionResult FromAnotherAction(string email)
{
    return RedirectToAction(nameof(ToAction));
         // will redirect to /to/<whatever the email param says>
         // no need to specify the route part explicitly
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.