38 votes

"Le dictionnaire de paramètres contient une entrée nulle pour paramètre" - Comment réparer?

J'essaie d'implémenter une page d'édition pour que l'administrateur puisse modifier les données de la base de données. Malheureusement, je rencontre une erreur.

Le code ci-dessous:

 public ViewResult Edit(int productId) {
       // Do something here 
}
 

mais j'obtiens cette erreur:

 "The parameters dictionary contains a null entry for parameter 'productId' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ViewResult Edit(Int32)' in 'WebUI.Controllers.AdminController'. To make a parameter optional its type should be either a reference type or a Nullable type.
Parameter name: parameters"
 

J'ai changé mon itinéraire en Global.asax.cs comme ceci:

  routes.MapRoute(
"Admin",
"Admin/{action}/{ productId}",
new { controller = "Admin", action = "Edit",  productId= "" }
);
 

mais je reçois toujours l'erreur.

45voto

Justin Niessner Points 144953

Que vide (" productId (dans votre itinéraire par défaut) sera analysée pour obtenir une valeur null par le Cadre, et depuis int ne permet pas de null...vous obtenez l'erreur.

Changement:

public ViewResult Edit(int productId)

pour

public ViewResult Edit(int? productId)

si vous souhaitez permettre à l'appelant de ne pas avoir à passer l'id d'un produit, qui est ce qu'il ressemble à ce que vous voulez faire, basée sur le chemin de votre itinéraire est configuré.

Vous pouvez également re-configurer votre itinéraire par défaut pour passer dans certains connus par défaut quand aucune productId est fourni:

routes.MapRoute( 
    "Admin", 
    "Admin/{action}/{ productId}", 
    new { controller = "Admin", action = "Edit",  productId= -1 } 

14voto

Phillip Steele Points 61

Je suis tombé sur le même problème en suivant l'exemple SportStore dans Pro ASP.Net

La solution a été que ma vue Index comporte le code suivant.

 @Html.ActionLink("Edit", "Edit", new { id=item.ProductID }) |
 

Cependant, ma méthode Edit dans mon contrôleur a été définie comme

 public ViewResult Edit(int productId)
 

changer ma vue d'index pour lire

 @Html.ActionLink("Edit", "Edit", new { productId=item.ProductID }) |
 

résolu le problème

6voto

VlaR Points 119

Voici comment ignorer ces erreurs d'argument pour toute méthode de contrôleur invoquée:

 public class MyControllerBase
{
   //...

   protected override void OnActionExecuted(ActionExecutedContext filterContext)
   {
       if (filterContext.Exception != null)
       {
           var targetSite = filterContext.Exception.TargetSite;
           if (targetSite.DeclaringType != null)
               if (targetSite.DeclaringType.FullName == typeof(ActionDescriptor).FullName)
                   if (targetSite.Name == "ExtractParameterFromDictionary")  // Note: may be changed in future MVC versions
                   {
                       filterContext.ExceptionHandled = true;
                       filterContext.Result = new HttpStatusCodeResult((int)HttpStatusCode.BadRequest);
                       return;
                   }
           //...
        }
        // ...
    }
}
 

4voto

Homero Barbosa Points 886

productId devrait être limité à int type.

 new {controller="Admin", action="Edit"},
new {productId = @"\d+" }
 

1voto

fatjazz Points 1

Peut-être avez-vous oublié de transmettre les données requises (dans ce cas, le «productId») dans la vue.
Je suppose que vous essayez d’accéder aux détails en cliquant sur le lien de la page d’index, que je considère également comme "View \ Admin \ index.cshtml".

     <td>
        @Html.ActionLink("Edit", "Edit", new { productId = item.ProductId }) |
        @Html.ActionLink("Details", "Details", new { productId = item.ProductId }) | //note the productId is filled by item.ProductId
        @Html.ActionLink("Delete", "Delete", new { productId = item.ProductId })
    </td>
 

Si vous ne le faites pas, tous les paramètres seront nuls, causant ainsi l'erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X