2016-05-26 90 views
-1

我正在使用一個Ajax交呼叫分配如下傳遞形式的數據:如何解決無效的JSON基元模型錯誤?

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

model參數用於告訴字符串化方法來解析的形式數據,作爲相同類型的模型的關係的圖。

但是,當我將JSON布爾值返回給ajax方法時,我得到了源自500內部服務器錯誤的JSON primitive model is invalid錯誤。我認爲這也會導致我的AJAX代碼中的success function被觸發。

問: 如何在返回布爾值來解決無效的JSON參數錯誤?

AJAX的方法:

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

刪除'的contentType:

以下的Ajax方法定義在完成了爲我工作 「應用/ JSON的;字符集= UTF-8」,'並以'數據:FORMDATA,'你模型將被正確綁定。 –

回答

-1

我薄誤差在data: {model: JSON.stringify(formData) }它應該是 data: { 'model': JSON.stringify(formData) }

0

展開的布爾值不是阿洛每個嚴格的JSON規範都需要wable,這要求所有的原語在數組或對象「包裝器」中傳遞。許多JSON序列化/反序列化庫確實增加了對未打包原語的支持,但除非您明確知道服務器和客戶端庫都支持此功能,否則不應該依賴此行爲。

我的建議是換行的結果物體像{"result": false}{"result": true}

+0

在我的情況下,包裹布爾的例子是什麼?我嘗試在我的json結果引號中包裝成功布爾,但得到了語法錯誤。 –

+0

@BrianJ一個例子與我在回答中所展示的完全一樣。或者如果你想在數組中包裝,可以是'[true]'或'[false]'。由於JSON支持這些原語,因此無需在實際的布爾值附近加上引號(這樣做會使其成爲字符串而不是布爾原語)。它必須位於對象或數組上下文中以符合JSON規範。 –

1

此:

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

不建立有效的JSON用於MVC消費。 (https://github.com/maxatwork/form2js

摘錄:

爲什麼不.serializeArray()?

JQuery的.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",這樣的額外參數而不是雙重編碼解決了上述Erik問題。

   $.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(); 

         } 
        } 
       }); 
相關問題