2013-04-03 17 views
19

mio regolatore:gamma Messaggio JavaScript con AJAX per ASP.NET MVC Controller

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

mi piacerebbe inserire i parametri per il controller tramite la tecnologia AJAX. Passare il numero int projectId non è un problema, ma non riesco a pubblicare lo int[].

codice JavaScript mio:

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

ho provato con una serie di test, ma senza successo. :( Ho anche cercato di impostare traditional: true, o contentType: 'application/json; charset=utf-8' ma senza successo così ...

La int[] useraccountIds inviato al mio controller è sempre nullo

+0

Si prega di inviare il messaggio di errore – Mortalus

+0

Ho debugato il metodo del controller e int [] useraccounts è sempre nullo. – mosquito87

+0

È sempre meglio esaminare i dati effettivi inviati. O prendi Fiddler o guarda i tuoi strumenti di sviluppo in Rete (ovvero in Chrome di Firefox/Firebug). – samjudson

risposta

34

Si potrebbe definire un modello di vista:.

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

poi adattare la vostra azione di controllo di prendere questo modello Vedi come parametro:

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

e, infine, invocalo:

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

Anche un projectId hardcoded (come 23) non viene inviato al controller. Viene invece inviato il vero dato del modulo (c'è anche un id del progetto). :( – mosquito87

+1

Questa funzione 'sendForm' laggiù, dove stai chiamando? È nell'evento di invio di qualche forma o nell'evento click di qualche pulsante di invio? Hai fatto in modo di annullare l'azione predefinita di questo evento restituendo false –

+0

Sì, avevi assolutamente ragione, che stupido errore, mi dispiace ... – mosquito87

0

se si desidera passare un array al motore mvc, inviare l'input più volte. modificare il codice al seguente:

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

Secondo il monitor di rete in firebug AJAX invia solo i dati che sono veramente nella forma ma non quello che ho specificato con i dati ... – mosquito87

+0

sì, ho trovato la soluzione e ho modificato la mia risposta, ma il mio codice non è testato, ma questa è la soluzione – Rabolf

0

Mettere l'attributo serializzabile sulla classe. Quindi proverà a convertire l'oggetto javascript che stai passando alla classe C#.

in JS:

{ 
    ProjectId = 0, 
    userAccountIds = [] 
} 

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

Funzionerebbe senza viewmodel? – mosquito87

+0

Sì, è sufficiente una classe ordinaria con attributo Serializable. – marko

2

Utilizzando $ .ajax(), si può facilmente ottenere i dati dal javascript al controller in MVC.

Come come,

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

poi, sul lato Controller,

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. 
} 

di riferimento. Send Data from Java Script to Controller in MVC

+0

il collegamento è rotto. – JoshYates1980

+0

Grazie Josh per avermi aggiornato .. Ho aggiornato il collegamento. si prega di controllare. In realtà ho spostato il mio blog da Wordpress a blogger. Quindi quel collegamento era rotto. Ora sta lavorando .. –

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

Non funzionerà se non si specifica che la richiesta Ajax (Post/GET) ha la proprietà traditional è impostato su true. Fare riferimento a questo question per ulteriori dettagli.