2017-11-18 5 views
1

Ich habe folgendes SetupC# MVC Ajax Kind listet

HTML

$.ajax({ 
    url: 'Transaction/updateTransaction', 
    data: saveDataObject, 
}).done(function (e) { 
    // done 
}); 

, die in der Registerkarte Netzwerk zeigt, dass es die richtigen Daten

Abfragezeichen Parameter

Senden
key:2445 
transactionDescription:Description Block 
transactionToType[0][transactionToTypeKey]:1 
transactionToType[0][transactionKey]:2445 
transactionToType[0][transactionValue]:51.25 
transactionToType[0][transactionTypeKey]:10 
transactionToType[1][transactionToTypeKey]:2 
transactionToType[1][transactionKey]:2445 
transactionToType[1][transactionValue]:10.5 
transactionToType[1][transactionTypeKey]:1 

-Controller

public class TransactionSave 
{ 
    public int key { get; set; } 
    public string transactionDescription { get; set; } 
    public List<TransactionToTypeSave> transactionToType { get; set; } 
} 

public class TransactionToTypeSave 
{ 
    public int transactionKey { get; set; } 
    public int transactionToTypeKey { get; set; } 
    public int transactionTypeKey { get; set; } 
    public decimal transactionValue { get; set; } 
} 

public int updateTransaction(TransactionSave transactionSave) 
{ 
} 

Wenn Sie einen Haltepunkt in updateTransaction tun kann ich sehen, transactionSave alle Daten (Schlüssel und Beschreibung) und die transactionToType Liste hat zwei Elemente, wie erwartet, jedoch hat diese beiden Listenelemente Alle Werte sind 0.

z

key:2445 
transactionDescription: Description Block 
transactionToType [ 
    transactionToTypeKey:0 
    transactionKey:0 
    transactionValue:0 
    transactionTypeKey:0 
], [ 
    transactionToTypeKey:0 
    transactionKey:0 
    transactionValue:0 
    transactionTypeKey:0 
] 

Was mache ich falsch, um Listen innerhalb von Objekten über Ajax zu übergeben?

Dank

+0

Ihre Daten für die Sammlung müssten im Format transactionToTypeKey: 1' (transactionToType [0]) sein (keine Klammern um den Namen der Eigenschaft). Aber Sie sollten keine Sammlung an eine GET-Methode senden. Abgesehen von der hässlichen Abfragezeichenfolge kann es die Abfragezeichenfolgengrenze überschreiten und eine Ausnahme auslösen –

Antwort

1

Es schlägt fehl, weil Ihr Ajax-Aufruf eine GET-Anfrage macht.

Wenn Sie den Typ proeprty nicht angeben, wenn Sie die Methode $.ajax verwenden, wird ein GET-Aufruf durchgeführt. Bei einem GET-Aufruf werden die Daten als Querystring-Schlüsselwertelemente an die URL angehängt, an die Sie den Ajax-Aufruf senden.

Wenn Sie ein komplexes Objekt mit untergeordneten Eigenschaften anderer Typen senden, sollten Sie eine POST-Anfrage durchführen. Abfragezeichenfolgen hat eine Grenze basierend auf dem Browser. Wenn die Anfrage POST-Typ ist, werden die Daten im Anfragetext gesendet.

Dies sollte funktionieren.

var saveDataObject = 
{ 
     key: 124, 
     transactionDescription:"My desc", 
     transactionToType: [{ 
           transactionKey: 111, 
           transactionTypeKey: 164, 
           transactionValue:23.34 
          } 
          ] 
}; 

$.ajax({ 
    type:'post', 
    url: '@Url.Action("updateTransaction","Transactions")', 
    contentType:"application/json", 
    data: JSON.stringify(saveDataObject) 
}).done(function(e) { 
    console.log(e); 
}); 

Stellen Sie sicher, markiert Ihre Aktion-Methode mit [Httppost] Attribut

[System.Web.Mvc.HttpPost] 
public ActionResult updateTransaction(TransactionSave transactionSave) 
{ 
    return Json(transactionSave); 
} 

Jetzt wird es für die Ajax-Request und der json Zeichenfolgeversion der js „application/json“ als content senden Das Objekt befindet sich im Anfragetext. Der Modellbinder kann die gebuchten Daten Ihrem Objekt zuordnen

+0

Danke Shyju. Ich habe es versucht, aber anscheinend das gleiche Ergebnis erzielt. Mein Netzwerk Tab sagt mir die Anfrage-Methode ist jetzt Post, und meine Daten werden als Formulardaten übergeben, die alles zu sagen scheint, was Sie vorgeschlagen haben, aber die Werte sind immer noch 0. Laufen Sie genau Code im Konsolenprotokoll (Ändern der URL zurück, die Werte in transactionToType sind auch 0. –

+0

Welche Version von MVC verwenden Sie? – Shyju

+0

Version 4.