为什么不提供任何参数

时间:2016-12-30 19:36:22

标签: javascript asp.net-mvc

我一直在向我的MVC Controller发布数据,没有任何问题(使用ajax post和HttpPost)。

我遇到的问题是,它是异步的,我需要它发布并等待响应。

因此,有get

但是,当我这样做时,永远不会传递参数。

我的Javascript是

//the type is "GET"
function toDatabase(type, url, data, successDelegate, failDelegate, errorDelegate) {
    $.ajax({
        type: type.toUpperCase(),
        url: url,
        contentType: "application/json;",
        data: data,
        dataType: "json",
        success: function (response) {
            successDelegate(response); removeSpinner();
        },
        failure: function (e) {
            failDelegate(e.statusText); removeSpinner();
        },
        error: function (e) {
            errorDelegate(e.statusText); removeSpinner();
        }
    })
}

我的控制器是

[HttpGet]
public JsonResult SaveNewStagePlan(string name)
{
    //todo save
    if (String.IsNullOrEmpty(name))
        return Json(new { id = -99 });  //always returns as name is null
}

我做错了什么?它在发布(并使用HttpPost)时工作正常。

修改

数据的值为{"name":"MyBand"},由另一个传递JSON.stringify({ 'name': localVariableBandName })

的函数创建

1 个答案:

答案 0 :(得分:1)

JSON.stringify方法接受一个js对象并返回该对象的字符串化版本。例如,如果将js对象{ name: 'shyju' }传递给此方法,则会得到字符串{"name":"shyju"}

当ajax调用是GET类型时,数据将作为查询字符串值发送。 $.ajax方法会根据需要将您在data属性中传递的js对象转换为查询字符串键值对并发送。

所以基本上你当前的代码就像这样发送查询字符串

Home/SaveNewStagePlan?{"name":"shyju"}`

所以你可以清楚地看到这不是一个有效的查询字符串!理想情况应该是Home/SaveNewStagePlan?name=shyju

因此,解决方案是将js对象(而不是对象的字符串化版本)传递给$.ajax调用。

这应该有用。

$.ajax({
    type: "GET",
    url: url,
    data: { name: 'shyju' },
    success: function(response) {
        console.log(response);
    },
    failure: function(e) {
    },
    error: function(e) {
    }
});

由于它将数据作为查询字符串发送,因此您不需要将contentType指定为"应用程序json"(尽管它仍然可以使用它)。

此外,无需将dataType显式指定为json,因为您的代码始终返回json数据。

此外,如果您的操作方法是GET操作方法,则需要显式指定要从中返回JSON数据。您可以使用Json方法的重载,该方法采用JsonRequestBehavior枚举值。

 return Json(new { id = -99 }, JsonRequestBehavior.AllowGet);