【发布时间】:2018-05-10 21:10:14
【问题描述】:
我有一个 .NET Core MVC 项目 (dotnet 2.0.0),我想从 .cshtml 视图向某个控制器方法发送 AJAX 请求。
我可以使用 GET 毫无问题地做到这一点。
AJAX:
var msg = {
someField: "some value",
someAnotherField: "another value"
};
jQuery.ajax({
url: '@Url.Action("DoStuff", "Some")',
dataType: 'application/json',
data: msg,
type: 'GET',
success: function(data) {
alert(data);
}
});
控制器:
public class SomeController : Controller
{
public JsonResult DoStuff(Msg post)
{
// some processing here
// ...
return Json("some result");
}
public class Msg
{
public string someField { get; set; }
public string someAnotherField { get; set; }
}
}
但是当我尝试使用 POST...
修改了 AJAX(只是改变了它的类型):
// ...
type: 'POST',
// ...
修改控制器方法(只是添加了一个属性):
// ...
[HttpPost]
public JsonResult DoStuff(Msg post)
// ...
...我得到Failed to load resource: the server responded with a status of 404 (Not Found)。
我尝试将[FromBody] 属性添加到控制器,但它没有改变任何东西(并且 GET 方法在没有它的情况下也可以正常工作)。我还为我的 AJAX data 尝试了 JSON.stringify() - 没有区别。
所以,我认为它与路由有关?或者也许将 JSON 对象作为参数传递给控制器对于 POST 请求是不同的?
更新
我创建了一个小项目 (uploaded to Dropbox) 来重现此问题,但我无法重现它。一切正常,只需更改为type: 'POST' 并添加[HttpPost] 就足够了。
所以,我的问题不在于 GET/POST 语义,而在于我的主项目中的一些设置/路由。我会尝试找出问题所在,并分享我的结果。
【问题讨论】:
-
对于帖子,使用路由属性,
[HttpPost] -
它就在那里,你可以在我的“修改后的控制器”代码中看到。
-
“修改后的控制器”是否在不同的控制器中?如果是这样,那么 ajax 将不会命中它,因为它指向“SomeController”。或者您的意思是它是完全相同的控制器,但您通过添加标签对其进行了修改?
-
这是同一个控制器,我只是添加了一个
[HttpPost]属性。 -
检查控制台中的网络选项卡,看看请求本身是什么样子的。比较获取 ajax 和发布 ajax 时的样子。使用 get,它应该添加 `?msg=....' 但使用 post 你应该有 JSON。
标签: jquery ajax asp.net-core asp.net-core-mvc