我试图使用ajax调用从View向控制器发送2个参数。当我仅使用1个参数时,此函数较早起作用,但由于添加了第二个参数,该函数不再起作用。
带有ajax的Javascript:
function DeleteRole(roleId) {
var confirmation = confirm("Are you sure you want Delete this Role");
if (confirmation) {
$.ajax({
type: "POST",
url: '@Url.Action("Delete_Role", "Admin")',
dataType: 'json',
data: JSON.stringify({
roleId: roleId,
applicationId: $('#AppList').val()
})
}).success(function (response) {
if (response.success) {
alert(response.responseText);
$(".k-grid").data("kendoGrid").dataSource.read();
}else {
alert(response.responseText);
}
}).error(function() {
alert("Error on Deletion");
});
}
}
MVC-控制器方法(信息根本不在这里)
[HttpPost]
public JsonResult Delete_Role(Guid rowId, Guid applicationId)
{
var users = new UserStore().ReadForAppRole(applicationId, rowId);
if (users.Any())
{
return Json(new { success = false, responseText = "Users's Currently Exist Within this Role" },
JsonRequestBehavior.AllowGet);
}
new RoleStore().RemoveRole(applicationId, rowId);
return Json(new { success = true, responseText = "Role Successfully Deleted" },
JsonRequestBehavior.AllowGet);
}
答案 0 :(得分:2)
两个问题
1)您的操作方法参数名称为rowId
,但是您正在发送roleId
2)JSON.stringify
方法创建传递给它的JavaScript对象的字符串表示形式。使用此方法,您将发送对象的JSON字符串作为data
方法选项的$.ajax
属性。发送JS对象的JSON字符串时,应将选项的contentType
属性指定为application/json
。
$.ajax({
type: "POST",
url: '@Url.Action("Delete_Role", "Admin")',
dataType: 'json',
data: JSON.stringify({
rowId: '@Guid.NewGuid()', // dummy GUID for testing
applicationId: '@Guid.NewGuid()'
}),
contentType:"application/json"
}).done(function (response) {
console.log(response);
}).fail(function() {
console.log("Error on Deletion");
});
现在$.ajax
会将请求标头Content-Type
添加到值为application/json
的呼叫中。作为模型绑定的一部分,默认的模型绑定器将读取此请求标头值,然后决定从请求正文(请求有效负载)中读取数据。
此外,由于您没有发送复杂的对象,因此不需要发送JSON字符串版本。只需将JavaScript对象作为data
属性传递,并且$.ajax
会将其作为表单数据发送。
$.ajax({
type: "POST",
url: '@Url.Action("Delete_Role", "Admin")',
data: {
rowId: '@Guid.NewGuid()', // dummy GUID for testing
applicationId: '@Guid.NewGuid()'
}
}).done(function (response) {
console.log(response);
}).fail(function() {
console.log("Error on Deletion");
});
在这种情况下,$.ajax
将发送application/x-www-form-urlencoded
作为Content-Type
请求标头值,并且模型绑定程序将能够正确读取它并将其映射为您的参数。
您还可以删除ajax调用中的dataType
(我在第二个代码段中所做的 )。 jQuery ajax将从响应标头中猜测正确的类型,并使用该类型进一步解析从服务器调用接收到的数据。在您的情况下,您正在调用Json
方法以从操作方法返回JSON响应,该方法将发送application/json
作为Content-Type
标头值。