MVC 3 - пара значений ключей данных jquery $ .ajax с JSON приводит к внутренней ошибке 500 - как мне это сделать? - PullRequest
1 голос
/ 02 апреля 2012

Редактировать: у меня есть решение, и я описал его немного больше в конце поста

Использование: 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");
    }

Теперь это работает отлично, и я могу довольно легко расширять свои классы, чтобы делать то, что яхочу.

Спасибо всем!

Ответы [ 3 ]

3 голосов
/ 02 апреля 2012

В вашем коде 3 ошибки:

A. Свойство PerfVar должно быть обнародовано, и его нужно получить и установить:

публичный класс PerfObj { публичная строка id {get; задавать; } public Perfvar perfVar {get; задавать; } }

B. Ваше JSON представление списка неверно. Должно быть:

 var e = [
               { "id": "foo", "perfVar": { "qid": "a", "tmr": "b"}}, 
               { "id": "foo", "perfVar": { "qid": "a", "tmr": "b"}}
           ];

C. Вы должны структурировать массив и указать тип: 'POST', чтобы передать его контроллеру MVC через ajax:

 $.ajax({
                url: '/run/submit',
                data: JSON.stringify(e),
                contentType: 'application/json, charset=utf-8',
                dataType: 'json',
                type: 'POST',
                success: function (data) { alert(data); }
            });
2 голосов
/ 02 апреля 2012

Вы не можете напрямую отобразить пару ключ / значение в плоскую последовательность. MVC не знает, как это сделать.

Вам либо нужно пользовательское связующее для модели , либо лучше / проще будет изменить способ создания JSON на стороне клиента, чтобы он действительно соответствовал вашей модели.

Примерно так:

var perfObjs = 
{
   { id: 1, perfVar: { qId: 1, tmr: 0 }},
   { id: 2, perfVar: { qId: 2, tmr: 0 }},
}
$.post("/run/submit", perfObjs, function(data) { alert(data);}, "application/json");
0 голосов
/ 02 апреля 2012

Поскольку контроллер не распознает значение json как List.

Почему бы просто не передать необработанную строку вашему контроллеру и позволить вашему контроллеру преобразовать строку json в объект?это будет намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...