我一直在向我的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 })
答案 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);