2012-04-11 5 views
1

Das macht mich verrückt!MVC3- und Ajax-Fehler "Das Parameterwörterbuch enthält einen Nulleintrag für den Parameter ..."

Ich habe eine Ansicht, die mit Ajax mit dem folgenden Skript bevölkert ist.

function loadAcquisitions() { 
    var description = $("input#searchDescription").val(); 
    var startDate = $("input#searchStartDate").val(); 
    var endDate = $("input#searchEndDate").val(); 

    $.ajax({ 
     type: "POST", 
     dataType: "json", 
     url: "/Acquisition/Find", 
     data: { searchDescription: description, searchStartDate: startDate, searchEndDate: endDate }, 
     success: function (jsonresults) { 
      $("tbody#acquisitionContent").find("tr").remove().end(); 

      var pageCount = parseInt(jsonresults.length/pageSize); 
      var startItemIndex = currentPageIndex * pageSize; 
      var itemsToDisplay = pageSize + startItemIndex; 

      if ((jsonresults.length - startItemIndex) < pageSize) { 
       itemsToDisplay = jsonresults.length - startItemIndex + pageSize; 
      } 

      for (var i = startItemIndex; i < itemsToDisplay; i++) { 
       $("tbody#acquisitionContent").append('<tr>' + 
        '<td><a href="/Acquisition/Edit/' + jsonresults[i].AcquisitionID + '">Edit</a></td>' + 
        '<td>' + jsonresults[i].AcquisitionDescription + '</td>' + 
        '<td>' + jsonresults[i].AcquisitionDate + '</td>' + 
        '<td>$' + jsonresults[i].AcquisitionCost + '</td>' + 
        '<td>$' + jsonresults[i].InstallationCost + '</td>' + 
        '<td class="last">$' + jsonresults[i].DeliveryCost + '</td>' + 
        '</tr>'); 
      } 

      $('#pageTitle').text('Page ' + (currentPageIndex + 1) + ' of ' + pageCount); 
     }, 
     error: function (c, b, a) { 
      alert(a); 
     } 
    }); 
} 

Bitte beachten Sie, dass die Verbindung der Leitung erzeugt wird, mit:

'<td><a href="/Acquisition/Edit/' + jsonresults[i].AcquisitionID + '">Edit</a></td>' 

Der Link-Tag erscheint korrekt generiert werden und ist in Form von

/Acquisition/Edit/123 

In der Steuerung, Ich habe die folgende Funktion namens "Bearbeiten", die wie folgt aussieht:

public ActionResult Edit(int acquisitionID) 
{ 
    Acquisition acquisition = Acquisition.Get(acquisitionID); 
    return View(acquisition); 
} 

Dann wird in der global.asax Ich habe eine Route für ‚Bearbeiten‘ definiert, die wie folgt aussieht:

routes.MapRoute(
    "EditAcquisition", 
    "{controller}/{action}/{acquisitionID}", 
    new { controller = "Acquisition", action = "Edit"} 
    ); 

Ich habe versucht, die ‚Edit‘ Funktion in der Steuerung Ändern eines Nullable-int zu akzeptieren (int?) acquisitionID, die den Fehler beseitigt - aber nicht die Tatsache ändert, dass eine Null in die "Edit" -Funktion des Controllers über den vom Ajax-Code erzeugten Link übergeben wird.

Jede Hilfe würde sehr geschätzt werden!

Danke!

Update:

Wenn ich die global.asax aktualisieren und 'acquisitionID' als Parameter wie folgt hinzu:

routes.MapRoute(
    "EditAcquisition", 
    "{controller}/{action}/{acquisitionID}", 
    new { controller = "Acquisition", action = "Edit", acquisitionID = 0 } 
    ); 

die Anwendung nun dadurch, dass die Navigations-Links ganz anders verhält, alle haben 'Index' angehängt.

/Acquisition/ 

wird

/Acquisition/Index 

Update:

Hier ist die RegisterRoutes Methode der global.asax

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     "EditProperty", 
     "{controller}/{action}/{propertyID}", 
     new {controller = "Property", action = "Edit"} 
     ); 

    routes.MapRoute(
     "EditAssignee", 
     "{controller}/{action}/{assigneeID}", 
     new {controller = "Assignee", action = "Edit"} 
     ); 

    routes.MapRoute(
     "EditAcquisition", 
     "{controller}/{action}/{acquisitionID}", 
     new {controller = "Acquisition", action = "Edit"} 
     ); 

    routes.MapRoute(
     "Default", 
     "{controller}/{action}/{id}", 
     new {controller = "Home", action = "Index", id = UrlParameter.Optional} 
     ); 
} 
+0

können Sie alle Ihre Routen (* in der Reihenfolge, die Sie * definiert haben) zeigen, weil es wie ein anderer Weg scheint, ist die Suche entsprechen –

Antwort

1

Ihre Route

routes.MapRoute(
     "EditProperty", 
     "{controller}/{action}/{propertyID}", 
     new {controller = "Property", action = "Edit"} 
     ); 

Spielen jede andere Strecke .. (da sie alle haben das gleiche Muster von /controller/action/id)

Die von new {controller = "Property", action = "Edit"} angegebenen Werte sind die standardmäßig nicht die erlaubten diejenigen. .

so wird jede URL in der Form /somecontroller/someaction/someid damit übereinstimmen, und die ID wird propertyID heißen.

Deshalb sollen Sie keine acquisitionID

Entweder nur erhalten bleiben, dass eine Route nur und generisch wie id die propertyID etwas nennen und das in Ihrer Methode verwenden, oder constraints für alle Routen verwenden, die identische Muster haben

routes.MapRoute(
     "EditProperty", 
     "{controller}/{action}/{propertyID}", 
     new {controller = "Property", action = "Edit"}, 
     new {controller = "Property", action="Edit"} // constraint 
     ); 
+0

Das war es ... Ich sehe jetzt, was das Problem war. Danke für Ihre Hilfe! –

1

Für meine Routen, ich immer den URLParameter Einstellung :

routes.MapRoute(
       "EditAcquisition", 
       "{controller}/{action}/{acquisitionID}", 
       new 
       { 
        controller = "Acquisition", 
        action = "Edit", 
        acquisitionID = UrlParameter.Optional 
       } 
      ); 

was auch funktioniert, wenn der Parameter nicht NULL erlaubt int. Ich habe auch getan

acquisitionID = 0 

Ich fürchte, ich kann nicht wirklich erklären, warum es funktioniert, obwohl.

EDIT

Etwas anderes

versuchen
"EditAcquisition", 
"Acquisition/Edit/{acquisitionID}", 
new 
{ 
    controller = "Acquisition", 
    action = "Edit", 
    acquisitionID = UrlParameter.Optional 
} 

So wird die URL gegen den zweiten Parameter angepasst wird, URL, nicht die dritte, die die Standardeinstellungen zurücksetzen.

+0

Sorry - ich habe gerade versucht, dass und jetzt habe ich einige zusätzliche Probleme, die ich werde die Frage hinzufügen. –

+0

@Andy können Sie den gesamten Routen-Abschnitt Ihrer global.asax - und alle im Bereich Bereiche, wenn Sie das haben. Ich vermute, dass eine andere Route gefunden wird, bevor die 'EditAcquisition' Eins ist. –

+0

Ich habe sie zu der Frage hinzugefügt –