web-dev-qa-db-ja.com

パラメーターmvcによるアクションへのリダイレクト

他のコントローラーのアクションにリダイレクトしたいのですが、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許容型、またはオプションのパラメーターとして宣言する必要があります。パラメーター名:パラメーター

13
Mohammadreza

このエラーは非常に説明的ではありませんが、ここで重要なのは '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 を参照してください。

18
Binke