2012-06-29 61 views
2

這是我第一次使用Ajax Json文章。json使用Ajax和MVC3解析錯誤

我現在下面的腳本代碼:

<script type="text/javascript"> 
$(document).ready(function() { 
    // If the button is clicked, redirect to a controller action, send the data, and show 
    // a view with the changes. 
    $('#submitDiffs').click(function() { 
     var requirementNumberData = "@Model.FirstOrDefault().Requirement.RequirementNumber"; 

     var data = []; 
     $('table tr').children('td').children('#selected :checked').each(function (i, element) { 
      var el = $(element); 
      data[i] = el.parent().siblings(':eq(1)').html(); 
     }); 

     diffParameters = GetDifferenceParameters(data); 
     var jsonData = JSON.stringify(diffParameters, null, 2); 

     $.ajax({ 
      url: '/Requirements/Differences', 
      type: 'POST', 
      data: jsonData, 
      dataType: 'json', 
      contentType: 'application/json; charset=utf-8', 
      // callback handler that will be called on error 
      success: function (response) { 
       alert("Ajax call made successfully!!!"); 
      }, 
      error: function (xhr, ajaxOptions, thrownError) { 
       alert(xhr.status + '\n\r' + xhr.responseText); 
       alert(thrownError); 
      }  

     }); 
    }); 

    function GetDifferenceParameters(data) { 
     var requirementNumber = "@Model.FirstOrDefault().Requirement.RequirementNumber"; 
     var oldRequirement = data[1]; 
     var newRequirement = data[0]; 

     return { 
      RequirementNumber: requirementNumber, 
      OldRequirement: oldRequirement, 
      NewRequirement: newRequirement 
     }; 
    } 
}); 

這個代碼發佈到MVC3控制器,下面的代碼:

[HttpPost] 
public ActionResult Differences(RequirementDifferenceViewModel model) 
{ 
    HtmlDiff diff = new HtmlDiff(model.OldRequirement, model.NewRequirement); 
    model.ContentDifference = diff.Build(); 

    return View(model); 
} 

這裏是視圖模型:

public class RequirementDifferenceViewModel 
{ 
    public string RequirementNumber { get; set; } 
    public string OldRequirement { get; set; } 
    public string NewRequirement { get; set; } 
    public string ContentDifference { get; set; } 
} 

如果我省略了jSON.stringify,控制器操作沒有得到執行,並且出現500錯誤。如果我stringify,我得到一個200的狀態,但是一個jSON解析錯誤返回給AJAX。在這兩種情況下,確切的jSON字符串都會發送到AJAX調用。

這裏是JSON字符串,我複製螢火蟲出來:

{ 
    "RequirementNumber": "PFSNET-UC12-008", 
    "OldRequirement": "\n    <p class=\"Bullet1\"><span style=\"font-size:10.0pt;font-family:Wingdings;\nfont-weight:normal\">r<span style=\"font:7.0pt &quot;Times New Roman&quot;\">&nbsp; </span></span><span lang=\"X-NONE\">[PFSNET-UC12-008] – Undo/redo will be supported for Expert\nAssistant. The details can be found in the use case for Undo/Redo.</span>&nbsp; </p> \n\n <p class=\"Bullet2\"><span style=\"font-family:Wingdings;font-weight:\nnormal\" lang=\"X-NONE\">§<span style=\"font:7.0pt &quot;Times New Roman&quot;\">&nbsp; </span></span><span class=\"msoIns\"><ins cite=\"mailto:Michelle%20Reini%20Hotchkiss\" datetime=\"2012-05-18T11:06\">A</ins></span><span class=\"msoIns\"><ins cite=\"mailto:Michelle%20Reini%20Hotchkiss\" datetime=\"2012-05-18T08:36\">n ‘Undo\nLast Action’ button will </ins></span><span class=\"msoIns\"><ins cite=\"mailto:Michelle%20Reini%20Hotchkiss\" datetime=\"2012-05-18T11:06\">also </ins></span><span class=\"msoIns\"><ins cite=\"mailto:Michelle%20Reini%20Hotchkiss\" datetime=\"2012-05-18T08:36\">be available</ins></span><span class=\"msoIns\"><ins cite=\"mailto:Michelle%20Reini%20Hotchkiss\" datetime=\"2012-05-18T11:05\"> for\nselect products</ins></span><span class=\"msoIns\"><ins cite=\"mailto:Michelle%20Reini%20Hotchkiss\" datetime=\"2012-05-18T08:36\">.&nbsp; See\nUC12-</ins></span><span class=\"msoIns\"><ins cite=\"mailto:Michelle%20Reini%20Hotchkiss\" datetime=\"2012-05-29T14:10\">229</ins></span><span class=\"msoIns\"><ins cite=\"mailto:Michelle%20Reini%20Hotchkiss\" datetime=\"2012-05-18T08:36\"> for\nadditional information.</ins></span></p> \n\n <p class=\"MsoNormal\">&nbsp;</p> \n\n\n   ", 
    "NewRequirement": "\n    <p class=\"Bullet1\"><span style=\"font-size:10.0pt;font-family:Wingdings;\nfont-weight:normal\">r<span style=\"font:7.0pt &quot;Times New Roman&quot;\">&nbsp; </span></span><span lang=\"X-NONE\">[PFSNET-UC12-008] – Undo/redo will be supported for Expert\nAssistant. The details can be found in the use case for Undo/Redo.</span>&nbsp; </p> \n\n <p class=\"Bullet2\"><span style=\"font-family:Wingdings;font-weight:\nnormal\" lang=\"X-NONE\">§<span style=\"font:7.0pt &quot;Times New Roman&quot;\">&nbsp; </span></span><span class=\"msoIns\"><ins cite=\"mailto:Michelle%20Reini%20Hotchkiss\" datetime=\"2012-05-18T11:06\">A</ins></span><span class=\"msoIns\"><ins cite=\"mailto:Michelle%20Reini%20Hotchkiss\" datetime=\"2012-05-18T08:36\">n ‘Undo\nLast Action’ button will </ins></span><span class=\"msoIns\"><ins cite=\"mailto:Michelle%20Reini%20Hotchkiss\" datetime=\"2012-05-18T11:06\">also </ins></span><span class=\"msoIns\"><ins cite=\"mailto:Michelle%20Reini%20Hotchkiss\" datetime=\"2012-05-18T08:36\">be available</ins></span><span class=\"msoIns\"><ins cite=\"mailto:Michelle%20Reini%20Hotchkiss\" datetime=\"2012-05-18T11:05\"> </ins></span><span class=\"msoIns\"><ins cite=\"mailto:Michelle%20Reini%20Hotchkiss\" datetime=\"2012-06-20T12:34\">on </ins></span><span class=\"msoIns\"><ins cite=\"mailto:Michelle%20Reini%20Hotchkiss\" datetime=\"2012-06-20T12:42\">the\nAdvanced Expert Assistant screen.&nbsp; </ins></span><span class=\"msoIns\"><ins cite=\"mailto:Michelle%20Reini%20Hotchkiss\" datetime=\"2012-05-18T08:36\">See\nUC12-</ins></span><span class=\"msoIns\"><ins cite=\"mailto:Michelle%20Reini%20Hotchkiss\" datetime=\"2012-05-29T14:10\">229</ins></span><span class=\"msoIns\"><ins cite=\"mailto:Michelle%20Reini%20Hotchkiss\" datetime=\"2012-05-18T08:36\"> for\nadditional information.</ins></span></p> \n\n <p class=\"MsoNormal\">&nbsp;</p> \n\n\n   " 
} 

我把這個字符串轉換成JSON驗證網站,它通過:[http://jsonformatter.curiousconcept.com/]

確切的分析錯誤是:語法錯誤:JSON.parse:意外的字符

任何幫助,將不勝感激!

編輯2:

事實證明,解析錯誤是不能夠正確地解析響應的AJAX成功處理程序的結果。我仍然試圖弄清楚這一部分。

只要Success事件執行,代碼執行就跳轉到Error事件。

回答

1

如果你在瀏覽器中運行這個瀏覽器,比如firefox或chrome(不是ie),那麼你可以檢查網絡文章並查看標題。在那裏,你應該能夠確切地看到傳遞的信息。很可能你會得到一些你不期望的字符,這會導致解析錯誤。

+0

我安裝了Firefox,它對調試腳本有很大的幫助。我仍然沒有確定解析錯誤,但你的回答是非常有幫助的。 –

0

var requirementParameters = "{ oldRequirement: contentRecords[1], newRequirement: contentRecords[0] }";無效json

你可能尋找類似:

var requirementParameters = { 
    oldRequirement: contentRecords[1], 
    newRequirement: contentRecords[0] 
}; 

這會爲您的字段的匿名對象。舊的代碼只是一個字符串,你可以再次使用這個字符串JSON.stringify

+0

我更新了我的問題,並修正了我將json字符串放在一起的方式,但仍然無法正常工作,但是如果我不將字符串化控制器操作調用。我不確定爲什麼。 –