2013-04-03 14 views
19

mojego kontrolera:tablica post JavaScript z AJAX dla ASP.NET MVC regulatorowi

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

chciałbym dodawać parametry do sterownika poprzez AJAX. Przekazanie int projectId nie stanowi problemu, ale nie mogę opublikować int[].

kod Mój JavaScript:

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

próbowałem go z tablicy testowej, ale bez powodzenia. :( Próbowałem też ustawić traditional: true lub contentType: 'application/json; charset=utf-8' ale bez sukcesu, a także ...

The int[] useraccountIds wysłana do mojego kontroler jest zawsze zerowa

+0

Proszę napisać komunikat o błędzie – Mortalus

+0

Mam debugowane metody kontrolera i int [] liczba kont użytkowników jest zawsze null. – mosquito87

+0

Zawsze najlepiej jest sprawdzić rzeczywiste przesyłane dane. Albo zdobądź Fiddlera, albo skorzystaj z narzędzi programistycznych w sieci (na przykład w przeglądarce Chrome Firefox/Firebug). – samjudson

Odpowiedz

34

Można zdefiniować model widok.

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

następnie dostosować działanie kontrolera skorzystać z widoku modelu jako parametr:

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

i wreszcie wywołaj:

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

Nawet zakodowany identyfikator projektu (np. 23) nie jest wysyłany do kontrolera. Zamiast tego wysyłane są prawdziwe dane formularza (jest też identyfikator projektu). :( – mosquito87

+1

Ta funkcja 'sendForm' tam, gdzie ją nazywasz? Czy jest w zdarzeniu 'submit' w jakiejś formie lub zdarzeniu kliknięcia jakiegoś przycisku przesyłania? Czy anulowałeś domyślną akcję tego zdarzenia przez zwrócenie wartości false z tego? Myślę, że tego nie zrobiłeś –

+0

Tak, miałeś absolutnie rację Co za głupia pomyłka Przepraszam ... – mosquito87

0

Jeśli chcesz przekazać tablicę do silnika mvc, wyślij dane wejściowe wiele razy. zmienić swój kod do następujących:

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

Według monitora sieciowego w firebug AJAX wysyła tylko te dane, które są naprawdę w formie, ale nie to, co określam z danymi ... – mosquito87

+0

tak, znalazłem rozwiązanie i edytowałem swoją odpowiedź, ale mój kod nie jest testowany, ale to jest rozwiązanie: – Rabolf

0

Put atrybut można zaszeregować na klasy. Następnie spróbuje przekonwertować obiekt javascript, który przekazujesz, do klasy C#.

w JS:

{ 
    ProjectId = 0, 
    userAccountIds = [] 
} 

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

Czy to byłoby bez modelu podglądu? – mosquito87

+0

Tak, zwykła klasa z atrybutem Serializowalnym jest wystarczająca – marko

2

Korzystanie $ .ajax(), można łatwo uzyskać dane z javascript do kontrolera w MVC.

W podobnych

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

następnie od strony sterownika,

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

odniesienia. Send Data from Java Script to Controller in MVC

+0

link jest zepsuty. – JoshYates1980

+0

Dzięki Josh za aktualizowanie mnie .. Zaktualizowałem link. proszę sprawdzić. Właściwie przeniosłem mojego bloga z Wordpressa do blogera. Więc ten link został zerwany. Teraz działa ... –

14

W JS:

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

w MVC/C#:

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

to nie będzie działać, chyba że podasz że wniosek ajax (post/Get) ma własność traditional jest ustawione na true. Aby uzyskać więcej informacji, zapoznaj się z tym question.

Powiązane problemy