web-dev-qa-db-ja.com

パラメータを持つRedirectToAction

私はこのようにしてアンカーから呼び出すアクションを持っています、Site/Controller/Action/IDここでIDintです。

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

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

514

Kurt's answer 私の研究によれば、正しいはずですが、試してみると、実際に動作させるためにはこれを実行する必要がありました。

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

RouteValueDictionaryでコントローラとアクションを指定しなかった場合はうまくいきませんでした。

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

後でやってくるのであれば、まずKurtの答えを試してみてください。それでも問題がある場合は、これを試してください。

175

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

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

これはSite/Controller/Action/99へのリダイレクトを引き起こします。一時データやビューデータは不要です。

848
Kurt Schindler

パラメータを含むRedirectToAction

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

それはあなたが1つ以上のパラメータを通過できることにも注目に値します。 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
          }
45
CF5

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を使用する代わりに、モデルフィールドに文字列を割り当てることもできます。

39
Rohit
//How to use RedirectToAction in MVC

return RedirectToAction("actionName", "ControllerName", routevalue);

return RedirectToAction("Index", "Home", new { id = 2});
37
Thivan Mydeen

あなたのパラメータがたまたま複雑なオブジェクトであるならば、 これは問題を解決します 。キーはRouteValueDictionaryコンストラクタです。

return RedirectToAction("Action", new RouteValueDictionary(Model))

もしあなたがコレクションを持っているなら、それはそれを少しトリッキーにします、 しかし、この他の答えはこれを非常にうまくカバーしています

22
mateuscb

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

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

17
Toriq Sagor

…….

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

…….

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

私も同様にこの問題を抱えていました、そしてあなたが同じコントローラの中にいるならばそれをするための全く素晴らしい方法は名前付きパラメータを使うことです:

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

これは何年も前のことかもしれませんが、とにかく、あなたが望むものに合うようにパラメータを追加または編集することができるので、これはあなたの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
Bahamut

あなたがコントローラの外側のアクションにリダイレクトする必要がある場合、これはうまくいきます。

return RedirectToAction("ACTION", "CONTROLLER", new { id = 99 });
6
chr.solr
RedirectToAction("Action", "Controller" ,new { id });

私のために働きました、new{id = id}をする必要はありませんでした

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

2
Zaeem Q

以下はasp.net core 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", "[email protected]");
    return RedirectToAction(nameof(ToAction));
         // will redirect to /to/[email protected]
}
[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
}
1
mikemay