2016-04-08 5 views
-1

Ich habe ein Beispiel, das eine JSON-Postanforderung an MVC-Controller sendet. Dieses Beispiel funktioniert in ASP.NET 4.5, funktioniert jedoch nicht in der neuesten Version von ASP.NET 5. Vermisse ich etwas in diesem Beispiel?JSON Post Request funktioniert nicht in ASP.NET5 MVC aber arbeitet in ASP.NET4.5 MVC

  1. Ich habe ein Modell erstellt, aber ich habe es nicht an die Datenbank gebunden. Es wird nur das im Speicher erstellte Objekt sein.

    public class SalesOrder 
    { 
        public int SalesOrderId { get; set; } 
        public string CustomerName { get; set; } 
        public string PONumber { get; set; } 
    } 
    
  2. Ich benutze Visual Studio 2015 die Modell-basierte Steuerung und die damit verbundene CRUD Ansichten zu erstellen. In diesem Beispiel werde ich jedoch nur die Ansicht "Erstellen" ausführen.

  3. In der Steuerung habe ich eine SalesOrder-Objektliste hart codiert und sie enthält nur ein Element. Ich werde es verwenden, um mit den CRUD-Ansichten zu arbeiten.

    private List<SalesOrder> salesOrderList = 
        new List<SalesOrder> ( 
         new SalesOrder[] 
         { 
          new SalesOrder() 
           { 
            SalesOrderId = 1, 
            CustomerName = "David", 
            PONumber = "123" 
           } 
         }); 
    
  4. in der Steuerung, schaffe ich auch eine neue Funktion „Speichern“ Anforderung zu verarbeiten. Die Anforderung ändert nur die CustomerName-Eigenschaft des Modells und springt dann mit dem JSON-Ergebnis zurück.

    [HttpPost] 
    public JsonResult Save(SalesOrder salesOrderViewModel) 
    { 
        salesOrderViewModel.CustomerName = "David returns"; 
    
        return Json(new { salesOrderViewModel }); 
    } 
    
  5. Im Create.cshtml, habe ich einen Knopf und heften sich an seinem Click-Ereignis JQuery-Skript.

    <p><button id="saveButton">Save</button></p> 
    

Dies ist JQueryScript.

$(function() { 
     var clickFunc = function() { 

      var salesOrderViewModel = { 
        "salesOrderViewModel": { 
        "SalesOrderId": 123, 
        "CustomerName": "ab", 
        "PONumber": "2", 
        } 
      } 

      $.ajax({ 
        url: "/SalesOrders/Save/", 
        type: "POST", 
        cache: false, 
        data: JSON.stringify(salesOrderViewModel), 
        contentType: "application/json; charset=utf-8" 
       }); 
      } 

     $('#saveButton').click(clickFunc) 
    }) 
  1. ich klicken Sie auf die Schaltfläche "Speichern" in Create.cshtml die Post-Anforderung auszulösen.

  2. Ich legte den Debug-Break-Point in der Steuerung und überprüfen Sie die kommende Postanforderung. In ASP.NET 4.5 funktioniert die JSON-Deserialisierung und es werden alle Werte angezeigt.

In ASP.NET 5 wird jedoch ein leeres Objekt zurückgegeben. Wenn Sie in ASP.NET 5-Fall F12 drücken, um den Debugger in Microsoft Edge zu starten, zeigt es an, dass die Post-Anforderung die richtigen Werte enthält, aber aus bestimmten Gründen nicht an den MVC-Controller übergeben wird.

Bitte sehen Sie diese Screenshots: http://i63.tinypic.com/68vwnb.jpg

Habe ich etwas verpasst? Vielen Dank für Ihre Hilfe ...

+0

Die Daten sollten nur 'Daten: {SalesOrderId: 123, CustomerName:" ab ", PONumber:" 2 "},' und entfernen Sie die 'contentType:" -Anwendung/json; charset = utf- 8 "Option. –

+0

Ich habe es erneut ohne contentType versucht, funktioniert aber immer noch nicht. Danke – David

+1

Funktioniert für mich. Es gibt eindeutig etwas anderes in Ihnen Code, dass Sie uns nicht gezeigt haben, dass das Problem verursacht –

Antwort

0

Ich glaube nicht, dass Sie den Namen des Parameters angeben müssen. Versuchen Sie:

  var salesOrderViewModel = { 
        "SalesOrderId": 123, 
        "CustomerName": "ab", 
        "PONumber": "2", 
      } 
+0

Es funktioniert immer noch nicht nach dem Entfernen des Parameternamens. – David

+0

Versuchen Sie die 'contentType:" Anwendung zu entfernen/json; charset = utf-8 "' – DCruz22

+0

@ DCruz22, Wenn Sie den 'contentType' entfernen, dann muss es nur sein' data: salesOrderViewModel, '(nicht angegeben) –

0

Ich denke, Sie müssen vonBody im Controller angeben.

[HttpPost] 
public JsonResult Save([FromBody]SalesOrder salesOrderViewModel) 
{ 
    salesOrderViewModel.CustomerName = "David returns"; 

    return Json(new { salesOrderViewModel }); 
} 
+0

Die Frage bezieht sich auf asp.net-mvc, nicht asp.net-web-api –

+0

Es funktioniert immer noch nicht nach dem Hinzufügen [FromBody]. – David

+0

Die '[FromBody]' 'ist nicht notwendig, wenn Sie den Modellbinder und das benutzerdefinierte Modell verwenden. – Hypnobrew

0

Danke für DCruz22 und Stephen Mücke. Die Arbeits Version des Skripts ist:

$(function() { 

    var clickFunc = function() { 

     var salesOrderViewModel = { 
      "salesOrderViewModel": { 
       "SalesOrderId": 0, 
       "CustomerName": "ab", 
       "PONumber": "2", 
       "MessageToClient": "POST to server" 
      } 
     } 

     $.ajax({ 
      url: "/SalesOrders/Save/", 
      type: "POST", 
      cache: false, 
      data: salesOrderViewModel 
     }); 
    } 

    $('#saveButton').click(clickFunc) 
}) 

Ich fand die Parameternamen „salesOrderViewModel“ kein Problem ist. Damit funktioniert das Skript noch.

Eigentlich ist diese Frage eine vereinfachte Version meines ursprünglichen Problems. Mein ursprüngliches Problem beginnt mit den KOs. Unten ist das Skript, das die Datenbindung durchführt. Nachdem der Benutzer auf die Schaltfläche "Speichern" geklickt hat, wird die Funktion self.save() aufgerufen und das Skript sendet die Postanforderung einschließlich des Datenmodells an den MVC-Controller.

SalesOrderViewModel = function (data) { 
    var self = this; 
    ko.mapping.fromJS(data, {}, self); 

    self.save = function() { 
     $.ajax({ 
      url: "/SalesOrders/Save/", 
      type: "POST", 
      cache: false, 

      data: ko.toJSON(self), 

      success: function (data) { 

      } 
     }); 
    } 
} 

Das Problem ist "ko.toJSON (Selbst-)" enthält einige andere Informationen. Im Folgenden finden Sie den Anfragetext, den ich vom Microsoft Edge-Debugger erfasst habe.

{"SalesOrderId":0, 
"CustomerName":"chiang123", 
"PONumber":"123", 
"MessageToClient":null, 
"__ko_mapping__":{ 
     "ignore":[], 
     "include":["_destroy"], 
     "copy":[], 
     "mappedProperties":{ 
      "SalesOrderId":true, 
      "CustomerName":true, 
      "PONumber":true, 
      "MessageToClient":true}}} 

Sie können alle Daten sehen beginnt von "ko_mapping" ist KnockoutJs spezifisch. Muss ich diese Daten manuell zuschneiden, damit dies funktioniert? Pro Informationen sollte natürlich die gleiche Implementierung in ASP.NET 4.5 funktionieren, aber ich habe es noch nicht probiert. Vielen Dank ...

Verwandte Themen