it-swarm.com.de

Array an mvc Action weiterleiten AJAX

Ich versuche, ein Array (oder IEnumerable) von Ints von über AJAX an eine MVC-Aktion zu übergeben, und ich brauche ein wenig Hilfe. 

das Javascript ist 

$.get('/controller/MyAction', { vals: arrayOfValues }, function (data) {...

und die Controller-Aktion ist 

public ActionResult MyAction(IEnumerable<int> arrayOfValues )

Im Moment wird die Anfrage als formatiert 

controller/MyAction?_=1301503418429&arrayOfValues[]=491&arrayOfValues[]=368&arrayOfValues[]=235&arrayOfValues[]=437

Ich bin fast da, wenn ich die eckigen Klammern abnehmen, bekomme ich die richtige Antwort. Wie soll ich dieses Array in mein get übergeben, damit der Controller erkennen kann, was es ist? 

Vielen Dank für deine Hilfe

Dave

115
Dave

Setzen Sie die traditionelle Eigenschaft auf true, bevor Sie den get-Aufruf durchführen.

jQuery.ajaxSettings.traditional = true

$.get('/controller/MyAction', { vals: arrayOfValues }, function (data) {... 
144
Chandu

Ich hatte in der Vergangenheit Probleme beim Versuch, einen POST auszuführen (nicht sicher, ob das genau das ist, was Sie gerade tun, aber ich erinnere mich, wenn Sie ein Array in übergeben, muss traditional auf true gesetzt sein.

 var arrayOfValues = new Array();

 //Populate arrayOfValues 
 $.ajax({ 
      type: "POST",
      url: "<%= Url.Action("MyAction","Controller")%>",
      traditional: true,
      data: { 'arrayOfValues': arrayOfValues }              
 });
108
Rion Williams

Ganz spät, aber verschiedene Antworten auf die hier bereits vorhandenen:

Wenn Sie anstelle von $.ajax die Abkürzungsfunktionen $.get oder $.post verwenden möchten, können Sie Arrays folgendermaßen übergeben:


Abkürzung GET

var array = [1, 2, 3, 4, 5];
$.get('/controller/MyAction', $.param({ data: array }, true), function(data) {});


// Action Method
public void MyAction(List<int> data)
{
    // do stuff here
}

Abkürzung POST

var array = [1, 2, 3, 4, 5];
$.post('/controller/MyAction', $.param({ data: array }, true), function(data) {});


// Action Method
[HttpPost]
public void MyAction(List<int> data)
{
    // do stuff here
}


Anmerkungen:

  • Der boolesche Parameter in $.param ist für die traditional -Eigenschaft, die MUSS true sein, damit dies funktioniert
47
SNag

Die Antwort auf die "traditionelle" Option ist richtig. Ich gebe nur ein paar Hintergrundinformationen dazu, die mehr darüber erfahren möchten.

Aus der jQuery-Dokumentation:

Ab jQuery 1.8 verwendet die $ .param () - Methode nicht mehr jQuery.ajaxSettings.traditional als Standardeinstellung und wird Standardeinstellung ist "false".

Weitere Informationen finden Sie hier: http://michaelsync.net/2012/04/05/tips-asp-net-mvc-javascriptserializer-3-questions-and-3-answers und http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

HTH

9
Tom Gerken

Sie sollten dazu in der Lage sein:

$.ajax({
   url: 'controller/myaction',
   data: JSON.stringify({
      myKey: myArray
   }),
   success: function(data) { /* Whatever */ }
});

Dann wäre Ihre Aktionsmethode so:

public ActionResult(List<int> myKey)
{
    // Do Stuff
}

Für Sie sieht es so aus, als müssten Sie nur Ihre Werte festlegen. Der JSONValueProvider in MVC konvertiert das zurück in ein IEnumerable für Sie. 

7
Tejs

WENN ALLE STRICKE REISSEN...

Keine der anderen Antworten löste mein Problem. Ich habe versucht, einen Aufruf der GET-Methode von JavaScript an einen MVC-Web-API-Controller auszuführen und ein Array von Ganzzahlen als Parameter innerhalb dieser Anforderung zu senden. Ich habe alle Lösungen hier ausprobiert, aber der Parameter auf meinem Controller wurde NULL (oder Nothing für Sie VB Benutzer). 

Ich fand meine Lösung schließlich in einem anderen SO post , und es war eigentlich ganz einfach: Fügen Sie einfach die [FromUri]-Annotation vor dem Array-Parameter im Controller hinzu (Ich musste den Aufruf auch mit aufrufen.) die Einstellung "traditionell" AJAX, um Klammeranmerkungen zu vermeiden). Siehe den Code, den ich in meiner Anwendung verwendet habe.


Controller-Signatur:

 Controller Signature HINWEIS: Die Anmerkung in C # wäre[FromUri]


JavaScript:

$.get('/api/InventoryApi/GetBalanceField', $.param({productIds: [42], inventoryFormId: 5493, inventoryBalanceType: 'Beginning'},true)).done(function(data) {console.log(data);});

Tatsächlicher URL-String:

http://randomhostname/api/InventoryApi/GetBalanceField?productIds=42&inventoryFormId=5493&inventoryBalanceType=Beginning
2
Lopsided

Ein bisschen spät hier, aber ich könnte die Lösung von SNag weiter in $ .ajax () verwenden. Hier ist der Code, falls er jemandem helfen würde:

var array = [1, 2, 3, 4, 5];

$.ajax({
    type: "GET",
    url: '/controller/MyAction',
    data: $.param({ data: array}, true),
    contentType: 'application/json; charset=utf-8',
    success: function (data) {
    },
    error: function (x, y, z) {
    }
});

// Action Method
public void MyAction(List<int> data)
{
    // do stuff here
}
0
Saket

Wenn Sie wie bisher von .Net Framework MVC zu ASP.NET Core MVC migrieren, haben sich die Dinge geringfügig geändert. Der Ajax-Aufruf muss für das Raw-Objekt unter Verwendung von stringify erfolgen, damit keine Daten von { vals: arrayOfValues } übergeben werden. Er sollte JSON.stringify(arrayOfValues) lauten wie folgt:

$.ajax({
   url: 'controller/myaction',
   data: JSON.stringify(arrayOfValues),
   success: function(data) { /* Whatever */ }
});

Die andere Änderung, die in ASP.NET Core vorgenommen wurde, besteht darin, die Fälschung von standortübergreifenden Anforderungen zu verhindern. Bei Aufrufen einer MVC-Aktion von einer Ajax-Methode muss der Attribut [FromBody] wie folgt auf den Aktionsparameter angewendet werden:

public ActionResult MyAction([FromBody] IEnumerable<int> arrayOfValues )
0

Wenn Sie ASP.NET Core MVC verwenden und die eckigen Klammern verwenden müssen (anstatt die jQuery-Option "traditionell" zu verwenden), besteht die einzige Option, die ich gefunden habe, darin, die Variable IEnumerable manuell in der Contoller-Methode zu erstellen .

string arrayKey = "p[]=";
var pArray = HttpContext.Request.QueryString.Value
    .Split('&')
    .Where(s => s.Contains(arrayKey))
    .Select(s => s.Substring(arrayKey.Length));
0
x5657