他のコントローラーのアクションにリダイレクトしたいのですが、ProductManagerControllerのコードが機能しません。
[HttpPost]
public ActionResult RedirectToImages(int id)
{
return RedirectToAction("Index","ProductImageManeger", new { id=id });
}
これは私のProductImageManagerControllerで:
[HttpGet]
public ViewResult Index(int id)
{
return View("Index",_db.ProductImages.Where(rs=>rs.ProductId == id).ToList());
}
パラメーターなしでProductImageManager/Indexに非常にうまくリダイレクトします(エラーなし)しかし、上記のコードでこれを取得します:
パラメーターディクショナリには、 '... Controllers.ProductImageManagerController'のメソッド 'System.Web.Mvc.ViewResult Index(Int32)'のnullを許可しない型 'System.Int32'のパラメーター 'ID'のnullエントリが含まれています。オプションのパラメーターは、参照型、null許容型、またはオプションのパラメーターとして宣言する必要があります。パラメーター名:パラメーター
このエラーは非常に説明的ではありませんが、ここで重要なのは 'ID'が大文字であることです。これは、ルートが正しくセットアップされていないことを示しています。アプリケーションがIDを持つURLを処理できるようにするには、少なくとも1つのルートが設定されていることを確認する必要があります。これは、App_StartフォルダーにあるRouteConfig.csで行います。最も一般的なのは、オプションのパラメーターとしてidをデフォルトルートに追加することです。
public static void RegisterRoutes(RouteCollection routes)
{
//adding the {id} and setting is as optional so that you do not need to use it for every action
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
これで、設定した方法でコントローラーにリダイレクトできるはずです。
[HttpPost]
public ActionResult RedirectToImages(int id)
{
return RedirectToAction("Index","ProductImageManager", new { id });
//if the action is in the same controller, you can omit the controller:
//RedirectToAction("Index", new { id });
}
1つまたは2つの機会に戻ると、通常のリダイレクトによっていくつかの問題が発生し、RouteValueDictionaryを渡すことでそれを行う必要がありました。 RedirectToAction with parameter の詳細
return RedirectToAction("Index", new RouteValueDictionary(
new { controller = "ProductImageManager", action = "Index", id = id } )
);
非常によく似たエラーが小文字 'id'で表示される場合、これは通常、ルートが提供されていないidパラメーターを予期しているためです(呼び出しIDなしのルート/ProductImageManager/Index
)。詳細については、 this so question を参照してください。