我正在尝试使用AJAX请求更新数据库中的记录。我能够使用类似于下面的内容进行插入,但是当我尝试更新或删除时,我没有成功。
这是我的ajax PUT方法:
$('#updateCr').click(function(e) {
e.preventDefault();
var updatedData = {
CrId: $('#CrId').val(),
CrName: $('#CrName').val(),
CrStatus: $('#CrStatus').val(),
CrPriority: $('#CrPriority').val(),
CrTitle: $('#CrTitle').val(),
CrDescription: $('#CrDescription').val()
};
console.log(changeRequest);
$.ajax({
type: "PUT",
url: "@Url.Action("MyControllerAction", "Home")",
content: "application/json; charset=utf-8",
dataType: "json",
data: updatedData,
cache: false,
success: function(d) {
if (d.success == true)
window.location = "index.html";
else {}
},
error: function(xhr, textStatus, errorThrown) {
// TODO: Show error
}
});
这是我的控制器
[HttpPut]
public JsonResult MyControllerAction(UpdatedDataObject updatedData)
{
try
{
myModel.UpdateDataMethod(updatedData);
}
catch (Exception e)
{
var theerrror = e.ToString();
return Json(new { result = theerrror });
}
return Json(new { result = "Success" });
}
提交数据时,控制器被触发,但它没有收到JSON对象。我在这里做错了什么?
答案 0 :(得分:2)
这个问题是一个错字。返回的JSON属性称为result
。在您的JS代码中,您使用success
。另请注意,您要发送application/x-www-form-urlencoded
数据,而不是application/json
。值得庆幸的是,这不是一个问题,因为ModelBinder将适用于这两种类型的请求。试试这个:
$.ajax({
type: "PUT",
url: "@Url.Action("MyControllerAction", "Home")",
dataType: "json",
data: updatedData,
cache: false,
success: function(d) {
if (d.result) {
window.location.assign("index.html");
} else {
console.log('do something constructive with the error here...');
}
},
error: function(xhr, textStatus, errorThrown) {
// TODO: Show error
}
});
最后,当AJAX请求的结果成功时,将用户重定向到另一个屏幕似乎有点多余。如果这是您需要的行为,那么AJAX的观点没有实际意义,您也可以使用标准表单提交。
答案 1 :(得分:0)
我发现包括JSON.stringify()经常为我解决这些问题
data: JSON.stringify(updatedData),
总代码如下所示:
$.ajax({
type: "PUT",
url: "@Url.Action("MyControllerAction", "Home")",
content: "application/json; charset=utf-8",
dataType: "json",
data: JSON.stringify(updatedData),
cache: false,
success: function(d) {
if (d.success == true)
window.location = "index.html";
else {}
},
error: function(xhr, textStatus, errorThrown) {
// TODO: Show error
}
});
答案 2 :(得分:0)
除了上面提供的内容之外,请注意,如果PUT和DELETE的动词标题不起作用,请参阅此处提供的响应:
ASP.NET Web API - PUT & DELETE Verbs Not Allowed - IIS 8
基本上你只需要这个:
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/>
<remove name="FormsAuthentication" />
</modules>
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>