2012-06-29 60 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字符串放在一起的方式,但仍然无法正常工作,但是如果我不将字符串化控制器操作调用。我不确定为什么。 –