Javascript ASP MVC jQuery$.ajax POST请求不调用控制器方法,但在;新鲜的;MVC项目
在ASP.NET MVC项目中,我有一个接受POST请求的控制器方法,如下所示(为了完整起见,使用“User”类): 我使用jQuery Ajax将此方法称为:Javascript ASP MVC jQuery$.ajax POST请求不调用控制器方法,但在;新鲜的;MVC项目,javascript,jquery,ajax,asp.net-mvc-4,http,Javascript,Jquery,Ajax,Asp.net Mvc 4,Http,在ASP.NET MVC项目中,我有一个接受POST请求的控制器方法,如下所示(为了完整起见,使用“User”类): 我使用jQuery Ajax将此方法称为: $.ajax({ url: '/test/TestMethod/', data: JSON.stringify({ user: { name: 'NewUserName', email: 'username@email.com' } }), type: 'POST', success: function
$.ajax({
url: '/test/TestMethod/',
data: JSON.stringify({ user: { name: 'NewUserName', email: 'username@email.com' } }),
type: 'POST',
success: function (data) {
alert(data);
},
error: function (xhr) {
alert('error');
}
});
当我创建一个新的ASP.NET MVC项目,并将此代码包含在新的测试控制器中时,一切正常。通过Fiddler查看,发出了一个POST请求,我得到了控制器方法返回值
但是,当我在当前正在开发的MVC项目中运行此代码时,它不起作用。从Fiddler中,我看到ajax调用首先启动一个POST方法,该方法获取一个301 http状态错误(“永久移动”)。随后立即发出GET请求,生成404 not found错误(这很有意义,因为没有使用此名称的GET操作方法)
所以我在新项目和现有项目中使用了完全相同的代码,但是代码只在新项目中有效。因此,很明显,我现有的项目中有某种东西以某种方式阻止它正常运行(并导致生成POST和GET请求的奇怪行为)。但我不知道它可能是什么,所以欢迎任何建议
更新-路由信息:
public static void RegisterRoutes(RouteCollection routes)
{
routes.AppendTrailingSlash = true;
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
}
更新2:
看起来此问题是由为此项目打开的内容安全策略设置引起的 您需要将
[FromBody]
注释放在方法的参数之前
[HttpPost]
public ActionResult TestMethod([FromBody]User user)
{
return Content("It worked");
}
ASP.net MVC framework将使用您在正文中传递的参数来识别该方法。我在实现自定义错误后遇到此问题,并且我的表单将一个大于允许的最大值的文件发回服务器。这导致了404.13错误。。。我想这是“文件太大”的默认错误 当自定义错误被打开时,我看到的只是404。当我知道请求类型是post,并且它发布的url是正确的时,我得到了一个404错误,这让我抓狂
希望这对别人有帮助 您是否检查了网络选项卡以查看申请是否指向正确的url?url看起来正常:您是否为此现有项目与新项目启用了任何自定义ASP.NET路由?firebug没有显示任何错误?在firebug中,我首先收到一个错误“POST 301永久移动”,然后是“get 404 Not Found”路由机制不使用请求主体来识别要调用的控制器方法,并且可能只需要将
FromBody
添加到参数声明中,就可以在参数必须来自的位置不明确时强制一种方法绑定参数。无论参数是简单类型还是复杂类型,它都可能来自正文,而不包含FromBody
。该属性只会影响从被调用方法观察到的参数值,而不会影响原则上定位方法的能力。
[HttpPost]
public ActionResult TestMethod([FromBody]User user)
{
return Content("It worked");
}