私は、私は以下のようなものをアンカーから呼び出すアクション、持っているが。Site/Controller/Action/ID
ID
int
後で、コントローラからこの同じアクションにリダイレクトする必要があります。
これを行う賢い方法はありますか?現在私はtempdata ID
を隠していますが、f5を押して戻った後でページを更新すると、tempdataが消えてページがクラッシュします。
私は、私は以下のようなものをアンカーから呼び出すアクション、持っているが。Site/Controller/Action/ID
ID
int
後で、コントローラからこの同じアクションにリダイレクトする必要があります。
これを行う賢い方法はありますか?現在私はtempdata ID
を隠していますが、f5を押して戻った後でページを更新すると、tempdataが消えてページがクラッシュします。
回答:
RedirectToAction()メソッドのrouteValuesパラメータの一部としてIDを渡すことができます。
return RedirectToAction("Action", new { id = 99 });
これにより、Site / Controller / Action / 99にリダイレクトされます。一時または任意の種類のビューデータは必要ありません。
Return RedirectToAction("Action", "Controller", New With {.id = 99})
カートの答えは私の研究から正しいはずですが、私が試したとき、実際に機能させるためにこれを行わなければなりませんでした:
return RedirectToAction( "Main", new RouteValueDictionary(
new { controller = controllerName, action = "Main", Id = Id } ) );
コントローラとアクションを指定しなかった場合、機能RouteValueDictionary
しませんでした。
また、このようにコーディングすると、最初のパラメーター(アクション)は無視されるようです。したがって、Dictでコントローラーを指定するだけで、最初のパラメーターでActionを指定することを期待している場合、それも機能しません。
後で問題が発生する場合は、最初にカートの答えを試してください。それでも問題が解決しない場合は、これを試してください。
controller
リダイレクトアクションがリダイレクト元のアクションと同じコントローラーにある場合、パラメーターはオプションであると思います。
RedirectToAction
パラメータ付き:
return RedirectToAction("Action","controller", new {@id=id});
new {id = id}
は、フレームワークが参照している変数を認識しているため、同様に機能します。
また、複数のパラメーターを渡すことができることにも注意してください。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
}
//How to use RedirectToAction in MVC
return RedirectToAction("actionName", "ControllerName", routevalue);
return RedirectToAction("Index", "Home", new { id = 2});
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を使用する代わりに、モデルフィールドに文字列を割り当てることができます。
パラメータがたまたま複雑なオブジェクトである場合、これで問題が解決します。キーはRouteValueDictionary
コンストラクタです。
return RedirectToAction("Action", new RouteValueDictionary(Model))
たまたまコレクションがあると、少しトリッキーになりますが、この他の答えはこれを非常にうまくカバーしています。
RedirectToAction("Action", "Controller" ,new { id });
私のために働いた、する必要はなかった new{id = id}
同じコントローラー内にリダイレクトしていたので、必要はありませんでした"Controller"
が、コントローラーがパラメーターとして必要な場合の背後にある特定のロジックがわかりません。
RedirectToAction("Action", "Controller", new { id = id});
Core 3.1アプリで必要なものでした。
エラーメッセージを表示したい場合は、[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 });
}
}
それがうまくいくことを願っています。
私もこの問題を抱えていました。同じコントローラ内にいる場合は、名前付きパラメータを使用するのが非常に良い方法です。
return RedirectToAction(actionName: "Action", routeValues: new { id = 99 });
これは数年前かもしれませんが、とにかく、必要に応じてパラメータを追加または編集できるため、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 } ) );
以下は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
}