Добавить массив JavaScript с AJAX в asp.net MVC-контроллер
Мой контроллер:
[HttpPost]
public ActionResult AddUsers(int projectId, int[] useraccountIds)
{
...
}
Я хочу опубликовать параметры контроллера через AJAX. Передача int projectId
не является проблемой, но я не могу опубликовать int[]
.
Мой код 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.');
}
});
}
Я попробовал его с тестовым массивом, но не добился успеха.:(
Я также попытался установить traditional: true
или contentType: 'application/json; charset=utf-8'
, но не успел...
int[] useraccountIds
, отправленный в мой контроллер, всегда равен нулю.
Ответы
Ответ 1
Вы можете определить модель представления:
public class AddUserViewModel
{
public int ProjectId { get; set; }
public int[] userAccountIds { get; set; }
}
затем адаптируйте действие вашего контроллера, чтобы взять эту модель представления в качестве параметра:
[HttpPost]
public ActionResult AddUsers(AddUserViewModel model)
{
...
}
и, наконец, вызовите его:
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.');
}
});
}
Ответ 2
В JS:
var myArray = new Array();
myArray.push(2);
myArray.push(3);
$.ajax({
type: "POST",
url: '/MyController/MyAction',
data: { 'myArray': myArray.join() },
success: refreshPage
});
В MVC/С#:
public PartialViewResult MyAction(string myArray)
{
var myArrayInt = myArray.Split(',').Select(x=>Int32.Parse(x)).ToArray();
//My Action Code Here
}
Ответ 3
Используя $.Ajax(), вы можете легко получить данные из javascript в Controller в MVC.
Как будто,
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.
}
)};
то на стороне контроллера
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.
}
Справочник.
Отправить данные с Java Script в контроллер в MVC
Ответ 4
Если вы хотите передать массив в mvc engine, отправьте его несколько раз. измените свой код на следующее:
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.');
}
});
}
Ответ 5
Поместите атрибут serializable в класс. Затем он попытается преобразовать объект javascript, который вы передаете в класс С#.
в JS:
{
ProjectId = 0,
userAccountIds = []
}
// C#
[Serializable]
public class AddUserViewModel
{
public int ProjectId { get; set; }
public int[] userAccountIds { get; set; }
}
Ответ 6
Это не сработает, если вы не укажете, что запрос ajax (Post/Get) имеет свойство
traditional
установлено значение true.
Подробнее см. question.