web-dev-qa-db-fra.com

Rediriger vers l'action par le paramètre mvc

Je souhaite rediriger vers une action dans un autre contrôleur, mais cela ne fonctionne pas, voici mon code dans ProductManagerController:

[HttpPost]
public ActionResult RedirectToImages(int id)
{
    return RedirectToAction("Index","ProductImageManeger", new   { id=id   });
}

et cela dans mon ProductImageManagerController:

[HttpGet]
public ViewResult Index(int id)
{
    return View("Index",_db.ProductImages.Where(rs=>rs.ProductId == id).ToList());
}

Il redirige très bien vers ProductImageManager/Index sans paramètre (pas d'erreur) mais avec le code ci-dessus j'obtiens ceci:

Le dictionnaire de paramètres contient une entrée nulle pour le paramètre 'ID' de type non nullable 'System.Int32' pour la méthode 'System.Web.Mvc.ViewResult Index (Int32)' dans '... Controllers.ProductImageManagerController'. Un paramètre facultatif doit être un type de référence, un type nullable ou être déclaré comme paramètre facultatif. Nom du paramètre: paramètres

13
Mohammadreza

Cette erreur est très non descriptive mais la clé ici est que 'ID' est en majuscule. Cela indique que l'itinéraire n'a pas été correctement configuré. Pour laisser l'application gérer les URL avec un identifiant, vous devez vous assurer qu'il y a au moins un itinéraire configuré pour cela. Pour ce faire, dans le RouteConfig.cs situé dans le dossier App_Start . La plus courante consiste à ajouter l'id en tant que paramètre facultatif à l'itinéraire par défaut.

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

Vous devriez maintenant pouvoir rediriger vers votre contrôleur comme vous l'avez configuré.

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

En une ou deux occasions, j'ai rencontré certains problèmes par redirection normale et j'ai dû y remédier en passant un RouteValueDictionary. Plus d'informations sur RedirectToAction avec paramètre

return RedirectToAction("Index", new RouteValueDictionary( 
    new { controller = "ProductImageManager", action = "Index", id = id } ) 
);

Si vous obtenez une erreur très similaire mais en minuscules 'id' , c'est généralement parce que la route attend un paramètre id qui n'a pas été fourni (appelant un route sans l'id /ProductImageManager/Index). Voir cette question pour plus d'informations.

18
Binke