2012-07-20 13 views
6

Der Parameter steht auf Null.MVC-Modell, das ein String-Array von jQuery-Post bindet

mvc Aktion

public PartialViewResult EditMultipleOrderStates(
    string[] orderTypeNames, 
    int[] orderIds) 

JavaScript

$('#edit-mulitple-order-states-button').click(function() { 
    ids = []; 
    types = []; 
    $checked = $('.order-queue-order input:checked'); 
    $orders = $checked.closest('.order-queue-order'); 
    $orders.each(function (index, elem) { 
     $order = $(elem); 
     ids.push($order.attr("orderId")); 
     types.push($order.attr("orderType")); 
    }); 
    data = { 
     orderIds: ids, 
     orderTypeNames: types 
    }; 
    $.post('EditMultipleOrderStates', data, function (response) { 
     //... 
    }); 
}); 

fiddler

enter image description here

orderIds%5B%5D=97&orderIds%5B%5D=98&orderIds%5B%5D=93&orderTypeNames%5B%5D=DeliveryOrder&orderTypeNames%5B%5D=DeliveryOrder&orderTypeNames%5B%5D=DeliveryOrder 

Sind es die eckigen Klammern, die das Problem verursachen? Wie kann ich an diese Arrays binden?

Edit: Ich erstelle die Query String in der Zwischenzeit manuell.

+1

Verwenden Sie die hier veröffentlichte Lösung. http://stackoverflow.com/questions/4402036/jquery-ajax-posting-array-to-asp-net-mvc-controller – BradLaney

Antwort

0

Es gibt einen schönen Artikel hier über die Übergabe mehrerer Parameter über einen POST hier.

POST Multiple parameters

Es spricht WebAPI aber ist in diesem Fall immer noch relevant.

+0

Ich habe nichts über Sammlungen in dort gesehen. Vielleicht werde ich nur manuell eine Zeichenfolge erstellen, die MVC versteht. – Benjamin

3

Sie müssen eine Art von JSON.stringify auf Daten aufrufen.

$.post('EditMultipleOrderStates', JSON.stringify(data), function (response) { 
     //... 
    }); 
+0

Es ist immer noch nicht bindend. Das erzeugt '{" orderIds ": [" 97 "," 98 "," 99 "]," orderTypeNames ": [" DeliveryOrder "," DeliveryOrder "," DeliveryOrder "]}'. Gibt es etwas, das ich in den MVC-Aktionsparametern ändern sollte? – Benjamin

1

@Benjamin. Hier ist ein bisschen ein detaillierteres Beispiel für das, was ich getan habe, dass

funktioniert
<script type="text/javascript"> 
    $(document).ready(function() { 
     $('#btnTest').click(function() { 

      var filter = { 
       OrgId: 3, 
       Drivers: [{ Name: "SGT-200" }, { Name: "SGT-100"}], 
       DrivenUnits: [{ Name: "Generator" }], 
       Regions: [{ Name: "REU" }], 
       SearchString : "Test search string" 
      }; 

      $.ajax(
       { 
        url: "/api/Dashboard/PostFilter", 
        type: "POST", 
        contentType: "application/json", 
        dataType: "json", 
        data: JSON.stringify(filter), 
        success: function(result) { 
         alert(result); 
        }, 
        error: function(error) { 

         alert("There was an error posting the data to the server: " + error.responseText); 

        } 
       }); 
     }); 
    }); 
</script> 

Hoffe das hilft.

EDIT: Und hier sind die passende C# Objekte

public class Filter 
{ 
    public int OrgId { get; set; } 
    public List<FilterData> Drivers { get; set; } 
    public List<FilterData> DrivenUnits { get; set; } 
    public List<FilterData> Regions { get; set; } 
    public List<FilterData> Operations { get; set; } 
    public List<FilterData> Connections { get; set; } 
    public string SearchString { get; set; } 
} 

public class FilterData 
{ 
    public string Type { get; set; } 
    public string Name { get; set; } 
    public int Count { get; set; } 
} 

Alle Ihre Typnamen übereinstimmen müssen. Und unten ist der Code, der den Anruf empfängt

public IQueryable<DashboardData> Post(Filter filter) { 
     using(_unitOfWork) 
     { 
      _dashboardRepository.UsingUnitOfWork(_unitOfWork); 

      return FilterDashboardData(_dashboardRepository.GetDashboardData(filter.OrgId), filter); 
     } 
    } 
+0

Danke. Das sieht ungefähr so ​​aus, als würde der Aufruf von stringify wie scottm empfohlen werden. Es schien nicht so, als ob MVC an den JSON binden wollte. Gibt es etwas, das im Controller ausgeführt werden muss, um an JSON-Arrays zu binden? – Benjamin

+0

@ Benjamin. Ich habe diesen Code verwendet, sowohl wie er ist, und mit einigen Änderungen, Domain-übergreifend, und es funktioniert keine Probleme. In dem Fall hätte ich ein C# -Filter-Objekt mit den entsprechenden Eigenschaften. Ich werde die C# -Klasse hinzufügen, damit Sie sehen können, was passiert.Wenn Ihr Mapping nicht funktioniert, dann ist wahrscheinlich etwas in Ihren Objektklassen falsch, in Bezug auf Datentyp/Name – stevethethread

+0

Das klingt ein wenig kompliziert im Vergleich zu der Standard-asp.net MVC-Modellbindung. – Benjamin

Verwandte Themen