Редактировать: у меня есть решение, и я описал его немного больше в конце поста
Использование: MVC 3, C #
Проблема:Массив obj ключ / значение, отправляемый контроллеру через $ .post / $. Ajax, приводит к внутренней ошибке сервера 500 на контроллере (поскольку значение, переданное методу в контроллере C #, равно нулю)
У меня естьмассив в формате:
{
"q_1": {
"qid": "1",
"tmr": 0
},
"q_2": {
"qid": "2",
"tmr": 0
}
}
Я получаю это через $ ("# myid"). data () - и это нормально.
Мне нужно отправить этомой контроллер, и попробовал и post и $ .ajax
var d = $("#q_data").data();
$.post("/run/submit", d, function(data) { alert(data);}, "application/json");
и
$.ajax({
url: '/run/submit',
data: d,
contentType: 'application/json',
dataType: 'json',
success: function (data) { alert(data); }
});
Метод на стороне C # это
public ActionResult Submit(List<PerfObj> dict)
{
int x = dict.Count;
return PartialView("_DummyPartial");
}
Где PerfObj моймодель
public class PerfObj
{
public string id { get; set; }
Perfvar perfVar;
}
public class PerfVar
{
public string qid { get; set; }
/* note I've tried both int and string for the tmr param */
public string tmr { get; set; }
}
Когда я выполняю это, вызов идет к контроллеру правильно - т.е. он попадает в метод submit.Однако параметр метода dict в
List<PerfObj> dict
равен нулю.
Почему?Похоже, что-то с моей моделью, не могу понять, как еще ее спроектировать, поэтому он правильно извлекает значения в параметр метода.
Когда я печатаю JSON.Stringify на консоли, он показываетпара ключ / значение правильно, поэтому я думаю, что он идет правильно на сервер, но сервер / MVC3 по какой-то причине не нравится или не может сопоставить его со списком PerfObjs.
РЕДАКТИРОВАТЬ: Решение
Maciej ответил на мой пост, как я решил это.В конечном итоге я создал массив perfObj на стороне клиента
$("#q_data").data(e,{key: e, perfVar: { qid: e, tmr: 0 }})
(ps - игнорируйте избыточное использование 'e', у меня есть другие планы, это фиктивный случай)
А затем я сопоставил его с JSON-дружественным массивом
var arr = [];
$.each($('#q_data').data(), function (i, e) {
var p = $(this).data(i);
var obj = { key: i, perfVar: { id: e.perfVar.qid, tmr: e.perfVar.tmr}};
arr.push(obj);
});
Затем он преобразовал его в строку
var q = JSON.stringify(arr);
$. Ajax'd, как описано в посте Мачей.
Я правильно переопределил свои классы
public class PerfObj
{
public string key { get; set; }
public PerfVar perfVar { get; set; }
}
public class PerfVar
{
public string id { get; set; }
public int tmr { get; set; }
}
и изменил сигнатуру моего метода контроллера
[HttpPost]
public ActionResult Submit(PerfObj[] dict)
{
return PartialView("_DummyPartial");
}
Теперь это работает отлично, и я могу довольно легко расширять свои классы, чтобы делать то, что яхочу.
Спасибо всем!