2013-04-03 5 views
19

Mein Controller:Beitrag JavaScript-Array mit AJAX ASP.NET MVC-Controller

[HttpPost] 
public ActionResult AddUsers(int projectId, int[] useraccountIds) 
{ 
    ... 
} 

Ich mag würde die Parameter an die Steuerung über AJAX posten. Passing the int projectId ist kein Problem, aber ich kann es nicht schaffen, die int[] zu veröffentlichen.

Mein JavaScript-Code:

function sendForm(projectId, target) { 
    $.ajax({ 
     traditional: true, 
     url: target, 
     type: "POST", 
     data: { projectId: projectId, useraccountIds: new Array(1, 2, 3) }, 
     success: ajaxOnSuccess, 
     error: function (jqXHR, exception) { 
      alert('Error message.'); 
     } 
    }); 
} 

Ich versuchte es mit einem Test-Array, aber ohne Erfolg. :( Ich habe auch versucht traditional: true zu setzen, oder contentType: 'application/json; charset=utf-8' aber keinen Erfolg auch ...

The int[] useraccountIds gebucht mein Controller immer null ist

+0

Bitte senden Sie die Fehlermeldung – Mortalus

+0

Ich habe die Controller-Methode debuggt und int [] useraccounts ist immer Null. – mosquito87

+0

Immer am besten, um die tatsächlichen Daten zu sehen, die gesendet werden. Entweder hol dir Fiddler, oder schau in deinen Entwickler-Tools unter Netzwerk nach (d. H. In Chrome von Firefox/Firebug). – samjudson

Antwort

34

Sie könnten ein Ansichtsmodell definieren.

public class AddUserViewModel 
{ 
    public int ProjectId { get; set; } 
    public int[] userAccountIds { get; set; } 
} 

dann Controller-Aktion anpassen diese Ansicht Modell als Parameter nehmen:

[HttpPost] 
public ActionResult AddUsers(AddUserViewModel model) 
{ 
    ... 
} 

und schließlich Rufen Sie es auf:

function sendForm(projectId, target) { 
    $.ajax({ 
     url: target, 
     type: 'POST', 
     contentType: 'application/json', 
     data: JSON.stringify({ 
      projectId: projectId, 
      userAccountIds: [1, 2, 3] 
     }), 
     success: ajaxOnSuccess, 
     error: function (jqXHR, exception) { 
      alert('Error message.'); 
     } 
    }); 
} 
+0

Selbst eine fest codierte projectId (wie 23) wird nicht an die Steuerung gesendet. Stattdessen werden die echten Formulardaten (es gibt auch eine Projekt-ID) gesendet. :( – mosquito87

+1

Diese 'sendForm' -Funktion drüben, wo rufst du sie an? Handelt es sich um das Submit-Ereignis eines Formulars oder das Klick-Ereignis einer Sende-Schaltfläche? Hast du dafür gesorgt, dass die Standardaktion dieses Ereignisses durch die Rückgabe von false abgebrochen wird –

+0

Ja, du hattest absolut Recht, was für ein blöder Fehler ... Es tut mir leid ... – mosquito87

0

Wenn Sie ein Array zu Mvc-Engine übergeben möchten, senden Sie die Eingabe mehrmals. ändern Sie Ihren Code auf die folgenden:

function sendForm(projectId, target) { 
var useraccountIds = new Array(1, 2, 3); 
var data = { projectId: projectId }; 
for (var i = 0; i < useraccountIds.length; i++) { 
    $.extend(true, data, {useraccountIds: useraccountIds[i]}); 
} 
$.ajax({ 
    traditional: true, 
    url: target, 
    type: "POST", 
    data: data, 
    success: ajaxOnSuccess, 
    error: function (jqXHR, exception) { 
     alert('Error message.'); 
    } 
}); 

}

+0

Nach dem Netzwerk-Monitor in Firebug AJAX sendet nur die Daten, die wirklich in der Form, aber nicht was ich mit Daten angeben ... – mosquito87

+0

ja, ich fand die Lösung und ich bearbeite meine Antwort., Aber mein Code ist nicht getestet, aber das ist die Lösung – Rabolf

0

Setzen Sie das serializable Attribut auf die Klasse. Dann wird versucht, das JavaScript-Objekt, das Sie übergeben, in die C# -Klasse zu konvertieren.

in JS:

{ 
    ProjectId = 0, 
    userAccountIds = [] 
} 

// C# 
[Serializable] 
public class AddUserViewModel 
{ 
    public int ProjectId { get; set; } 
    public int[] userAccountIds { get; set; } 
} 
+0

Würde dies ohne Viewmodel funktionieren? – mosquito87

+0

Ja, eine normale Klasse mit dem Serializable-Attribut ist ausreichend – marko

2

Mit $ Schnipsel() können Sie ganz einfach die Daten von Javascript an den Controller in MVC bekommen.

Wie wie

var uname = 'John Doe'; 

$.ajax({ 

     url: "/Main/getRequestID", // This is path of your Controller with Action Result. 
     dataType: "json",   // Data Type for sending the data 

     data: {      // Data that will be passed to Controller 
      'my_name': uname,  // assign data like key-value pair  
      // 'my_name' like fields in quote is same with parameter in action Result 
     }, 

     type: "POST",    // Type of Request 
     contentType: "application/json; charset=utf-8", //Optional to specify Content Type. 

     success: function (data) { // This function is executed when this request is succeed. 
       alert(data); 
     }, 

     error: function (data) { 
       alert("Error"); // This function is executed when error occurred. 
     } 
)}; 

dann auf der Steuerungsseite,

public ActionResult getRequestID(String my_name) 
{ 

    MYDBModel myTable = new Models.MYDBModel(); 
    myTable.FBUserName = my_name; 
    db.MYDBModel.Add(myTable); 
    db.SaveChanges();    // db object of our DbContext.cs 
    //return RedirectToAction(“Index”); // After that you can redirect to some pages… 
    return Json(true, JsonRequestBehavior.AllowGet); // Or you can get that data back after inserting into database.. This json displays all the details to our view as well. 
} 

Referenz. Send Data from Java Script to Controller in MVC

+0

Verbindung ist pleite. – JoshYates1980

+0

Danke Josh für die Aktualisierung .. Ich habe den Link aktualisiert. bitte prüfe. Eigentlich habe ich meinen Blog von Wordpress auf Blogger verlegt. So war die Verbindung unterbrochen. Jetzt geht es.. –

14

In JS:

var myArray = new Array(); 
myArray.push(2); 
myArray.push(3); 
$.ajax({ 
      type: "POST", 
      url: '/MyController/MyAction', 
      data: { 'myArray': myArray.join() }, 
      success: refreshPage 
     }); 

In MVC/C#:

public PartialViewResult MyAction(string myArray) 
{ 
    var myArrayInt = myArray.Split(',').Select(x=>Int32.Parse(x)).ToArray(); 
    //My Action Code Here 
} 
0

Es wird nicht funktionieren, wenn Sie angeben, dass die Ajax-Anforderung (Post/Get) hat die Eigenschaft traditional ist auf wahr gesetzt. Weitere Informationen finden Sie unter question.