MVC-多参数Ajax调用

时间:2018-11-19 16:12:37

标签: javascript ajax asp.net-mvc

我试图使用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);
    } 

1 个答案:

答案 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标头值。