JSON Post调用错误函数

我有这个jquery post调用,它以某种方式调用错误函数,即使它将数据完全输入到数据库中。

 $(document).ready(function () { $("#ExtMailCreate").click(function () { var url = '@Url.Action("Create")'; var data = JSON.stringify(SaveExternalMail()); $.ajax({ type: "POST", url: url, data: data, dataType: "json", contentType: "application/json; charset=utf-8", success: function (data) { $("#result").append("pass"); }, error: function (data) { $("#result").append("error"); } }); }); }); function SaveExternalMail() { var costcentrecode = $("#CostCentreCode").val(); var day = $("#ExtMailDatePicker").val(); var externalMailItemID = $("#ExternalMailItemID").val(); var externalMailLocationID = $("#ExternalMailLocationID").val(); var quantity = $("#Quantity").val(); return { CostCentreCode: costcentrecode, Day: day, ExternalMailItemID: externalMailItemID, ExternalMailLocationID: externalMailLocationID, Quantity: quantity }; }  

– 控制器

   _ Function Create(ByVal collection As ExternalMail) As JsonResult Try If ModelState.IsValid Then _repositoryForExternalMail.Save(collection, "") End If Return Json(New ExternalMail With {.CostCentreCode = collection.CostCentreCode, .Day = collection.Day, .Quantity = collection.Quantity}, JsonRequestBehavior.AllowGet) Catch ex As Exception Return Json("An Error Occurred") End Try End Function 

—-更新—

Google Chrome报告了以下错误:

POST localhost / Mail / ExternalMail / Create 403(Forbidden)
jquery.min.js:4发送jquery.min.js:4 f.extend.ajax
jquery.min.js:4(匿名函数)创建:59 f.event.dispatch
jquery.min.js:3 h.handle.i

– 页面来源

      Create                   
jQuery(function(){jQuery("#Menu").kendoMenu({});});
$(document).ready(function () { var exturl = 'https://stackoverflow.com/Mail/ExternalMail/Create'; $("#ExtMailCreate").click(function () { var dataJSON = JSON.stringify(SaveExternalMail()); $.ajax({ cache: false, type: "POST", url: exturl, data: dataJSON, contentType: 'application/json; charset=utf-8', success: function (data) { showMessage("test", "information"); }, error: function (xhr, textStatus, errorThrown) { showMessage("An error occurred while adding this record. Please try again later.", "error"); } }); }); }); function showMessage(message, messageType) { $().ready(function () { $('#dialog').jqm(); switch (messageType) { case 'information': $('#dialog').removeClass("errorMessage"); $('#dialog').addClass("informationMessage"); break; case 'error': $('#dialog').removeClass("informationMessage"); $('#dialog').addClass("errorMessage"); break; default: break; } $('#dialog').html("Close
" + message); $('#dialog').jqmShow(); }); } function SaveExternalMail() { var costcentrecode = $("#CostCentreCode").val(); var day = $("#ExtMailDatePicker").val(); var externalMailItemID = $("#ExternalMailItemID").val(); var externalMailLocationID = $("#ExternalMailLocationID").val(); var quantity = $("#Quantity").val(); return { CostCentreCode: costcentrecode, Day: day, ExternalMailItemID: externalMailItemID, ExternalMailLocationID: externalMailLocationID, Quantity: quantity }; }
ExternalMail
Sydney
Test
Test10
jQuery(function(){jQuery("#ExtMailDatePicker").kendoDatePicker({"format":"d/MM/yyyy","min":new Date(1900,0,1,0,0,0,0),"max":new Date(2099,11,31,0,0,0,0)});});

– Ajax请求响应

 Request URL:http://localhosthttps://stackoverflow.com/Mail/ExternalMail/Create Request Method:POST Status Code:403 Forbidden Request Headersview source Accept:*/* Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 Accept-Encoding:gzip,deflate,sdch Accept-Language:en-GB,en-US;q=0.8,en;q=0.6 Authorization:Negotiate TlRMTVNTUAADAAAAAAAAAEgAAAAAAAAASAAAAAAAAABIAAAAAAAAAEgAAAAAAAAASAAAAAAAAABIAAAABcKIogUBKAoAAAAP Connection:keep-alive Content-Length:113 Content-Type:application/json; charset=UTF-8 Cookie:ASP.NET_SessionId=tg1xrabaigumj3fxooa1satc DNT:1 Host:localhost Origin:http://localhost Referer:http://localhosthttps://stackoverflow.com/Mail/externalmail/Create User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22 X-Requested-With:XMLHttpRequest Request Payload {"CostCentreCode":"B125","Day":"20/03/2013","ExternalMailItemID":"4","ExternalMailLocationID":"1","Quantity":"2"} Response Headersview source Cache-Control:private, s-maxage=0 Content-Length:127 Content-Type:application/json; charset=utf-8 Date:Wed, 20 Mar 2013 01:31:21 GMT Server:Microsoft-IIS/5.1 X-AspNet-Version:4.0.30319 X-AspNetMvc-Version:3.0 X-Powered-By:ASP.NET 

我认为问题是指定JsonRequestBehavior.AllowGet

然后发布到方法:

 $.ajax({ type: "POST", url: url, 

如果数据库已填充,我们知道存储库代码正在触发。 浏览器正在报告一个HTTP403,它闻起来像框架正在抛出安全exception,如果它期望响应GET并接收POST,它可能会做。

尝试将控制器中的方法从JsonResult更改为ActionResult

   _ Function Create(ByVal collection As ExternalMail) As ActionResult 

如果指定数据类型为json但是响应无法解析为json,则ajax请求将进入错误块。

打开chrome并在错误块中放置一个断点并查看数据的值。 将内容放在jsonvalidation器中并检查以确保您的响应是有效的json。

还将您的成功和错误函数的方法sig更改为

 success: function(data, txtStatus, jqxhr){ // code here } error: function( jqxhr, txtStatus, errorThrown) { // code here } 

然后在这些function中放置断点,你可以检查参数并更清楚地看到发生了什么。

– 更新因为您收到403错误代码,请在stackoverflow上查看此答案并检查您指向的文件夹的权限

403发布asp.net MVC后被禁止

也看看这个,因为你运行IIS 5.1看起来像…它可能是类似的

在IIS 5.2上运行MVC2应用程序

正如denas所说,您需要检查返回的textStatus和errorThrown生成的变量中的内容,因为您可以返回除返回的200个HTTP代码之外的其他内容,并且您的代码仍然执行得很好(这是因为您报告的记录被添加到数据库)。 200 HTTP代码将触发“成功”function,我现在无法回想起,但4xx或5xx中的某些内容应该触发“错误”function。

这里要考虑的主要是它是webserver的HTTP返回代码,它控制在jquery ajax调用中触发的函数

将您的代码更改为:

 error: function( jqXHR, textStatus, errorThrown ) { console.log(textStatus); console.log(errorThrown); } 

并告诉我们你在那些textStatus和errorThrown变量中有什么。