2016-05-12 5 views
5

Ich arbeite um E-Commerce-Wagen. Ich habe zwei Ansichtsmodelle.Pass zwei Viewmodels zu Aktion

Zuerst für Kunden Info:

public class CartViewModel 
    { 
     public string FirstName{get;set;} 
     public string Email{get;set;} 
     //... other fields 
} 

Und zweitens für Kunden Warenkorb:

public class ProductsCart 
    { 
     public Guid Id { get; set; } 
     public decimal Price { get; set; } 
     public int ItemsOrdered { get; set; } 
    } 

Die Hauptsache ist, dass Wagen in Benutzer local Speicherung und ich sollte es von localstorage mit Kunden Informationen gelangen über jQuery zu MVC `s Aktion:

[HttpPost] 
public ActionResult ConfirmOrder(CartViewModel model, IEnumerable<ProductsCart> cart) 
    { 
     // validate and save to database 
    } 

Und ich habe Javascript-Methode zu se nd Daten zu meiner Aktion:

function ConfirmOrder() { 
    var serverCart = LocalCartToSercerCart(); //see first screnshot 
    var customerData = $("#FORM_WITH_CUSTOMERS_VIEW_MODEL").serialize(); 

    $.ajax({ 
     method: "POST", 
     url: "/Cart/ConfirmOrder", 
     data: {model: customerData, cart: serverCart } 
    }) 
    .done(function() { 
     //do something 
    }); 

} 

Aber ich immer null-Wert immer für meinen CartViewModel (Screenshot 2)

Ich legte auch Dateien mit meinen Debug-Informationen.

Wenn ich schreibe Javascript-Funktion wie folgt aus:

function ConfirmOrder() {  
    var customerData = $("#cartForm").serialize(); 

$.ajax({ 
    method: "POST", 
    url: "/Cart/ConfirmOrder", 
    data: customerData 
    }) 
.done(function() { 
    //some code 
    });  
} 

ich nur Modelldaten (siehe Abbildung 3)

enter image description here

enter image description here

enter image description here

bekommen

EDIT: mit Ich schrieb Code Igor`s Antwort, aber immer noch null immer in Aktion Parameter enter image description here

Antwort

7

Der Grund, warum Sie einen Nullwert erhalten ist, weil die Daten zu JSON nicht konvertiert werden, bevor sie gesendet wird zum Server. Der JQuery Ajax-Aufruf führt dies nicht automatisch für Sie durch. Sie können es leicht mit JSON.stringify wie folgt konvertieren.

$.ajax({ 
    method: "POST", 
    url: "/Cart/ConfirmOrder", 
    data: JSON.stringify({model: customerData, cart: serverCart }), 
    contentType: 'json' // added to tell the server the format of the data being sent 
}) 
.done(function() { 
    //do something 
}); 

JSON.stringify wandelt Ihr Objekt JSON richtig formatiert, die dann an den Server gesendet wird. Von der documentation.

Die JSON.stringify() -Methode konvertiert einen JavaScript-Wert in eine JSON-Zeichenfolge und ersetzt optional Werte, wenn eine Ersetzungsfunktion angegeben ist oder optional nur die angegebenen Eigenschaften enthält, wenn ein Ersetzungsarray angegeben ist.

Hinweis wurde auf @StephenMuecke Kommentar unterhalb dieser Edit basiert. Meine vorherige Antwort war nicht korrekt, die einzige Änderung, die notwendig war, war zu Ihrem Javascript Ajax Anruf, nicht Ihre C# -Code.

+2

oder er benutzen konnte [Tupeln] (https://nitinasp.wordpress.com/2014/02/03/tuples-in-mvc/) – Manoj

+0

I versucht, wie Sie geschrieben, aber immer noch Null (hier Bildschirm meines Jobs) https://drive.google.com/open?id=0B-dajRUS_6ynQUFLakQ3RTJ5NFU – dantey89

+0

@ Dantey89 - nicht sicher, was Sie senden, aber ich im Allgemeinen nicht folgen externen Links (sicheres Surfen und alles). Wenn Sie zusätzliche Fragen oder ein Update haben, bitte aktualisieren Sie Ihre Frage mit diesen Details, ich werde mehr als glücklich sein, auf diese Weise zu antworten. Wenn es nur eine Frage ist, kannst du das auch in einem Kommentar posten (am selben Ort, an dem du gerade diesen Link gepostet hast). – Igor

1

Nach vielen Versuchen fand ich endlich eine Lösung.Für mich war es diese Javascript-Code:

function ConfirmOrder() { 

    var serverCart = LocalCartToSercerCart(); 
    var customerData = $('#cartForm').serialize(); 

    var paramObj = {}; 
    $.each($('#cartForm').serializeArray(), function (_, kv) { 
     paramObj[kv.name] = kv.value; 
    }); 

    var Data = { 
     model: paramObj, 
     cart: serverCart 
    } 


    $.ajax({ 
     method: "POST", 
     url: "/Cart/ConfirmOrder", 
     contentType: 'application/json', 
     data: JSON.stringify(Data) 

    }) 
    .done(function() { 

    }); 

} 

Und diese Aktion in MVC:

[HttpPost] 
    public ActionResult ConfirmOrder(CartViewModel model, IEnumerable<ProductsCart> cart) 
    { 
    // operations with data 
    } 

Die kye richtige Transformation von Formulardaten an Javacript Objekt war. Wie ich verstehe, konvertiert die Serialize() - Methode das Formular in WebForm-Daten, und es ist nicht zulässig, als EINES DER PARAMETER gesendet zu werden. Serialize() muss ein ganzes Objekt sein ... Vielleicht liege ich falsch, du kannst deine Vorschläge in Kommentaren schreiben, ich werde es gerne lesen.

Besonderer Dank geht an Igor und StephenMuecke