2013-09-02 18 views
5

Próbuję przekazać tablicę int z JavaScript do kontrolera MVC, który akceptuje 2 parametry - tablicę int i int. Ma to na celu przekierowanie strony do widoku zwrócone przez działanie kontrolera.Przekazywanie tablicy int do kontrolera MVC

var dataArray = getAllIds(); //passes back a JavaScript array 
window.location.replace("/" + controllerName + "/EditAll?ids=" + dataArray + "&currentID=" + dataArray[0]) 

dataArray zawiera 1,7 zgodnie z oczekiwaniami dla mojego użycia próbki.

kod kontrolera

public virtual ActionResult EditAll(int[] ids, int currentID) 
{ 

    currentModel = GetID(currentID); 
    currentVM = Activator.CreateInstance<ViewModel>(); 
    currentVM.DB = DB; 
    currentVM.Model = currentModel; 
    currentVM.ViewMode = ViewMode.EditAll; 
    currentVM.ModelIDs = ids; 

    if (currentModel == null) 
    { 
     return HttpNotFound(); 
    } 

    return View("Edit", MasterName, currentVM); 
} 

Kwestia jest taka, że ​​podczas inspekcji int [] identyfikatory przekazywane do sterownika, to wartość jest null. currentID jest ustawiony na 1 zgodnie z oczekiwaniami.

Próbowałem już ustawić jQuery.ajaxSettings.traditional = true, który nie ma żadnego efektu Próbowałem również utworzyć adres URL strony serwera przy użyciu @ Url.Action w JavaScript. Próbowałem również JSON.Stringify przed przekazaniem tablicy np.

window.location.replace("/" + controllerName + "/EditAll?ids=" + JSON.stringify(dataArray) + "&currentID=" + dataArray[0]) 

Znów tablica id kończy się wartością zerową po stronie sterownika.

Czy ktoś ma jakieś wskazówki dotyczące prawidłowego przekazania tablicy int do kontrolera? Mogłabym zadeklarować parametr jako String w akcji kontrolera i ręcznie serializować i dekompilować parametr, ale muszę zrozumieć, jak uzyskać strukturę do automatycznego przeprowadzania prostych konwersji typów.

Dzięki!

Odpowiedz

9

Aby przekazać tablicę prostych wartości w MVC, wystarczy podać tę samą nazwę wielu wartościom, np. URI skończy się szuka czegoś jak ten

/{controllerName}/EditAll?ids=1&ids=2&ids=3&ids=4&ids=5&currentId=1 

The domyślnego modelu wiązania w MVC zwiąże tego parametru działania int array poprawnie.

Teraz, jeśli był to zestaw złożonych wartości, istnieją dwa podejścia, które można zastosować do wiązania modelu. Załóżmy, że masz typ Podobnie jak

public class ComplexModel 
{ 
    public string Key { get; set; } 

    public string Value { get; set; } 
} 

i podpis działania kontrolera

public virtual ActionResult EditAll(IEnumerable<ComplexModel> models) 
{ 
} 

dla modelu wiążące poprawnie, wartości muszą zawierać podziałowe w żądaniu np

/{controllerName}/EditAll?models[0].Key=key1&models[0].Value=value1&models[1].Key=key2&models[1].Value=value2 

My używasz int podziałowe tutaj, ale można sobie wyobrazić, że może to być dość sztywny w zastosowaniu, gdzie przedmioty prezentowane użytkownikowi w interfejsie użytkownika mogą być dodawane i usuwane w dowolnym index/szczeliny w kolekcji . W tym celu MVC umożliwia również określenie własnego indeksera dla każdego elementu w kolekcji i przekazanie tej wartości za pomocą żądania dotyczącego domyślnego wiązania modelu do użycia np.

/{controllerName}/EditAll?models.Index=myOwnIndex&models[myOwnIndex].Key=key1&models[myOwnIndex].Value=value1&models.Index=anotherIndex&models[anotherIndex].Key=key2&models[anotherIndex].Value=value2 

Tutaj mamy określone własne indeksujących, myOwnIndex i anotherIndex do wiązania użyć, aby powiązać zbiór złożonych typów modelu. Możesz użyć dowolnego ciągu znaków do indeksowania, o ile wiem.

Alternatywnie można zaimplementować własny segregator, aby określić, w jaki sposób przychodzące żądanie powinno być powiązane z modelem. Wymaga to więcej pracy niż użycie domyślnych konwencji ramowych, ale dodaje kolejną warstwę elastyczności.

+0

Czy nie ma potrzeby ominięcia faktu, że trzeba utworzyć długi łańcuch, wykonując pętlę wokół tablicy i dodając każdy element do ciągu zapytania? –

+0

Oznaczyłeś, że używasz jQuery, więc powinieneś móc użyć '$ .param' http://api.jquery.com/jQuery.param/ do zbudowania zakodowanych wartości np. 'window.location.replace ("/"+ controllerName +"/EditAll? "+ $ .param ({ids: dataArray, currentId: dataArray [0]}))' –

Powiązane problemy