2016-05-26 7 views
-1

Я передавая данные формы, используя следующее назначение в Ajax после вызова:Как разрешить ошибку примитивной модели JSON?

data: {model: JSON.stringify(formData) }, 

model Параметр используется, чтобы сообщить stringify метод для анализа данных формы, как и тот же тип модели связей с точки зрения.

Но когда я возвращаю значение bool JSON для метода ajax, я получаю ошибку JSON primitive model is invalid, вызванную ошибкой внутреннего сервера 500. Я думаю, что это также вызывает мой success function в коде ajax от стрельбы.

Вопрос: Как устранить неверную ошибку параметра JSON при возврате значения bool?

Аякса метод:

var formData = $("createForm").serialize(); 

$.ajax({ 
       type: "POST", 
       url: '@Url.Action("Index", "CreateEscalation")', 
       data: {model: JSON.stringify(formData) }, 
       cache: false, 
       contentType: "application/json; charset=utf-8", 
       dataType: "json", 
       success: function (json) { 
        if (json.Success) { 
         window.location.href = json.redirectUrl; 
        } 
        else{ 
         $('#submitStatus').text("Error occurred while processing your request, please try again or contact system administrators"); 
         $(this).addClass('alert alert-danger fade in'); 
         $('#submitStatus').show(); 
        } 
       }, 
       error: function (jqXHR, exception) { 


       } 

      }); 

Контроллер сообщение метод:

[HttpPost] 
    public ActionResult Index(Escalation escalation) 
    { 
     try 
     { 


      bool success = sqlConnection.InsertWebReq(escalation); 


      if (success) 
      { 
       return Json(new 
       { 
        redirectUrl = Url.Action("Index", "EscalationHistory"), 
        Success = true 
       }); 

      } 
      else 
      { 
       return Json(new 
       { 
        Success = false 
       }); 

      } 

     } 
     catch (Exception ex) 
     { 
      return Json(new 
      { 
       Success = false 
      }); 
     } 
    } 
+0

Remove 'CONTENTTYPE: "приложения/JSON; кодировка = UTF-8",' и использовать 'данные: FormData,' и вы модель будет правильно привязана. –

ответ

-1

Я тонкая ошибка в data: {model: JSON.stringify(formData) } она должна быть data: { 'model': JSON.stringify(formData) }

0

развернутого логическое значение не allo wable в строгих спецификациях JSON, которые требуют, чтобы все примитивы передавались внутри массива или объекта «обертка». Многие библиотеки сериализации/десериализации JSON добавляют поддержку для распакованных примитивов, но вы не должны рассчитывать на это поведение, если только вы не знаете, что поддерживают как серверные, так и клиентские библиотеки.

Мое предложение было бы обернуть результат в объект как {"result": false} или {"result": true}

+0

Что будет примером обернутого bool в моем случае? Я попробовал обернуть успех bool в результате моего json в кавычках, но получил синтаксическую ошибку. –

+0

@BrianJ Пример был бы точно таким, как я показал в своем ответе. Или, если вы хотите обернуть массив, может быть '[true]' или '[false]'. Нет необходимости ставить кавычки вокруг вашего фактического логического значения (это сделает его строкой, а не логическим примитивным), поскольку JSON поддерживает эти примитивы. Это просто должно быть в контексте объекта или массива для соответствия спецификации JSON. –

1

это:

var formData = $("createForm").serialize(); 

Не создает действительный JSON для MVC, чтобы потреблять. (https://github.com/maxatwork/form2js)

Выдержки:

Почему не .serializeArray()?

JQuery's .serializeArray() работает немного иначе.Это делает эту структуру из разметки в «Массивах объектов/вложенные объекты» Пример:

[ 
    { "person.friends[0].email" : "[email protected]" }, 
    { "person.friends[0].name" : "Smith Agent" }, 
    { "person.friends[1].email" : "[email protected]" }, 
    { "person.friends[1].name" : "Thomas A. Anderson" } 
] 

Во-вторых вы двойное кодирование:

var formData = $("createForm").serialize(); // First encode 

$.ajax({ 
      type: "POST", 
      url: '@Url.Action("Index", "CreateEscalation")', 
      data: {model: JSON.stringify(formData) }, // Encoding Again ? 

Так вы JSON является Prety много мусора, потому что это будет выглядеть так:

{ 
    'model' : 'asdf=1&qwer=2' 
} 

или

{ 
    'model' : '{ asdf:1, qwer:2 }' 
} 
+0

Итак, что вы говорите, используйте serializeArray() вместо .stringify(), и это решит ошибку возврата? –

0

Сохраняя его простым и удаляя дополнительные параметры, такие как contentType: "application/json; charset=utf-8",, а не двойное кодирование, решили проблему, как указано выше Эрика.

Следующая Ajax определение метода работал для меня в закончу:

   $.ajax({ 
         url: "@(Url.Action("Index", "CreateEscalation"))", 
         type: 'POST', 
        traditional: true, 
        data: $("#createForm").serialize(), 
        dataType: "json", 
        success: function (result) { 
         //todo: use result 
         if (result.Success) { 
          window.location.href = result.redirectUrl; 
         } 
         else { 
          $('#submitStatus').text("Error occurred while processing your request, please try again or contact system administrators"); 
          $(this).addClass('alert alert-danger fade in'); 
          $('#submitStatus').show(); 

         } 
        } 
       }); 
Смежные вопросы