2010-03-23 7 views
37

Ich versuche eine Bearbeitungsseite zu implementieren, damit der Administrator Daten in der Datenbank ändern kann. Leider habe ich einen Fehler gefunden."Das Parameterwörterbuch enthält einen Nulleintrag für Parameter" - Wie zu beheben?

Der folgende Code:

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

aber ich bin immer diese Fehlermeldung:

"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" 

ich meine Route wie dies in Global.asax.cs geändert:

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

aber noch bin ich immer der Fehler .

Antwort

44

Diese leere Zeichenfolge für productId (in Ihrer Standardroute) wird vom Framework zu einem Nulleintrag geparst, und da int nicht null ... zulässt, erhalten Sie den Fehler.

Wechsel:

public ViewResult Edit(int productId) 

zu

public ViewResult Edit(int? productId) 

, wenn Sie wollen, damit für den Anrufer nicht in einem Produkt-ID übergeben haben, das ist, was es sieht aus wie das, was Sie tun möchten, basierend auf der Art, wie Ihre Route konfiguriert ist.

Sie können auch Ihre Standardroute neu konfigurieren, in einem bekannten Standard passieren, wenn kein productId geliefert:

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

der Standard „int“ Klasse (int32) nicht NULL-Werte akzeptieren, und es wird in diesem Fall eine Umwandlung von einer leeren Zeichenfolge in int fehlschlagen und versuchen, null zuzuweisen.

Ich würde wahrscheinlich einen Blick darauf werfen, was Sie erreichen wollen - wenn Sie versuchen, den Administrator zu zwingen, eine productID für sie zu haben, um diesen Datensatz in der Datenbank zu bearbeiten, würde ich darüber nachdenken in das Request-Objekt oder eine andere Methode, die mehr Vielseitigkeit bietet.

4

productId sollte auf int Typ beschränkt werden.

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

Vielleicht haben Sie vergessen, die erforderlichen Daten (in diesem Fall die 'productId') in der Ansicht zu übergeben.
Ich nehme an, Sie versuchen, die Details über den Link in der Index-Seite klicken, die ich nahm an, es als auch „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> 

dies nicht tun wird führen alle sein params null verursacht somit den Fehler.

6

Hier ist die Art und Weise, wie solches Argument Fehler für jede Controller-Methode invoke zu ignorieren:

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; 
        } 
      //... 
     } 
     // ... 
    } 
} 
15

ich über das gleiche Problem nach dem gearbeitet SportStor Beispiel in Pro ASP.Net

Die Lösung war, kam Tatsächlich hat meine Indexansicht den folgenden Code.

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

jedoch meine Edit-Methode in meinem Controller wurde als

definiert
public ViewResult Edit(int productId) 

meine Index Ansicht

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

das Problem behoben

0

Ändern es auf der Strecke zu lesen Ändern konnte implizieren andere Routen, die dieselbe URL verwenden. Um es einfach zu halten und alle Grundlagen abzudecken.

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

    //Or proceed as normal 
} 

Dies ist auch toll, wenn dies ein Fehler ist, dass Sie immer, wenn Sie auf der Seite zugreifen, weil Sie eine ID benötigt haben, (zum Beispiel ... Leute die URL in der Adressleiste setzen, wenn sie nicht sollte), dann den Parameter auf einen optionalen Wert einstellen.

EDIT: sorry int, nicht lange, wie die Frage gestellt

Verwandte Themen