2016-05-12 10 views
5

Pracuję nad koszykiem e-commerce. Mam dwa modele widoku.Przekaż dwie wizjery do działania

Pierwszy Informacje o klientow:

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

A po drugie dla klientów koszyk:

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

Najważniejszą rzeczą jest to, że koszyk przechowywania użytkownicy localStorage i powinien przekazać go od localStorage z informacją klientów poprzez jquery do działania MVC:

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

Mam metodę javascript do se nd dane do mojego działania:

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 
    }); 

} 

Ale zawsze się wartość zerową dla mojego CartViewModel (screenshot 2)

Ja również dołączone pliki z mojego informacji debugowania.

Jeśli piszę funkcji javascript takiego:

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

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

otrzymuję tylko dane modelowe (patrz ilustracja 3)

enter image description here

enter image description here

enter image description here

EDIT: pisałem kod za pomocą Igor`s odpowiedź, ale wciąż się wartość null w parametrze działania enter image description here

Odpowiedz

7

Powodem otrzymujesz wartość null jest fakt, że dane nie są konwertowane do formatu JSON przed wysłaniem na serwer. Wywołanie ajax JQUERY nie robi tego automatycznie dla ciebie. Możesz łatwo przekonwertować go za pomocą JSON.stringify, tak jak.

$.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 konwertuje obiekt prawidłowo sformatowany JSON, który jest następnie wysyłany do serwera. Od documentation.

Sposób

JSON.stringify() konwertuje wartość JavaScript na sznurkiem JSON, ewentualnie zastępując wartości, jeśli funkcja substytut został określony lub ewentualnie zawierającą tylko określone właściwości, jeśli tablica zamiennik jest określona.

Uwaga Ta edycja była oparta na komentarzu @StephenMuecke poniżej. Moja poprzednia odpowiedź nie była poprawna, jedyną zmianą, która była konieczna była twoja javascript ajax wywołanie, nie twój kod C#.

+2

lub mógłby wykorzystać [krotki] (https://nitinasp.wordpress.com/2014/02/03/tuples-in-mvc/) – Manoj

+0

I wypróbowany tak, jak napisałeś, ale wciąż null (tutaj ekran mojej pracy) https://drive.google.com/open?id=0B-dajRUS_6ynQUFLakQ3RTJ5NFU – dantey89

+0

@ dantey89 - nie jestem pewien, co wysyłasz, ale generalnie nie śledzę linków zewnętrznych (bezpieczne przeglądanie i wszystkie). Jeśli masz dodatkowe pytania lub aktualizację, zaktualizuj swoje pytanie tymi szczegółami, z przyjemnością odpowiem w ten sposób. Jeśli jest to tylko pytanie, możesz również zamieścić to w komentarzu (to samo miejsce, w którym właśnie opublikowałeś ten link). – Igor

1

Po wielu próbach znalazłem rozwiązanie.Dla mnie to był ten kod javascript:

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() { 

    }); 

} 

i to działanie w MVC:

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

kye rację dane formularza transformacja do javacript obiekt. Jak rozumiem, metoda Serialize() konwertuje formularz na dane WebForm i nie można go wysłać jako JEDNEJ Z PARAMETRÓW. Serialize() musi być całym obiektem ... Może się mylę, możesz pisać sugestie w komentarzach, chętnie przeczytam.

Specjalne podziękowania do Igor i StephenMuecke