web-dev-qa-db-fra.com

"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 afin 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 dans Global.asax.cs comme ceci: 

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

mais je reçois toujours l'erreur.

37
Naim

Cette chaîne vide pour productId (dans votre route par défaut) sera analysée comme une entrée nulle par Framework, et puisque int n'autorise pas null... vous obtenez l'erreur.

Changement:

public ViewResult Edit(int productId)

à

public ViewResult Edit(int? productId)

si vous souhaitez permettre à l'appelant de ne pas avoir à transmettre un identifiant de produit, il correspond à ce que vous souhaitez faire en fonction de la configuration de votre itinéraire.

Vous pouvez également reconfigurer votre route par défaut pour transmettre certaines valeurs par défaut connues lorsque aucun productId n'est fourni:

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

J'ai rencontré le même problème en suivant l'exemple SportStore dans Pro ASP.Net.

La solution était en fait 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

14
Phillip Steele

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;
                   }
           //...
        }
        // ...
    }
}
6
Vlad Rudenko

productId devrait être contraint à int type.

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

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.

1
fatjazz

Le changer sur la route pourrait impliquer d'autres routes qui utilisent la même URL. Pour rester simple et couvrir toutes les bases.

[HttpGet]
public ActionResult ThePage(int id = -1)
{
    if(id == -1)
    {
        return RedirectToAction("Index");
    }

    //Or proceed as normal
}

C’est également une bonne chose s’il s’agit d’une erreur que vous obtenez lorsque vous accédez à la page, car vous devez disposer d’un identifiant (par exemple ... les personnes qui placent l’URL dans la barre d’adresse alors qu’elles ne sont pas supposées le faire) puis définissent paramètre à une valeur facultative.

EDIT: désolé int, pas longtemps que la question posée

0
J-Roel

la classe "int" standard (int32) n'accepte pas les valeurs NULL et échouera la conversion d'une chaîne vide en int dans ce cas et essaiera de lui affecter la valeur null. 

Je voudrais probablement jeter un coup d'œil à ce que vous essayez d'accomplir - si vous essayez de forcer l'administrateur à avoir un ID de produit lui permettant d'éditer cet enregistrement dans la base de données, je penserais à l'insérer dans l'objet Request ou une autre méthode qui donnera plus de polyvalence.

0
Jason M