【问题标题】:ASP MVC jQuery $.ajax POST request does not call controller method, but works in "fresh" MVC projectASP MVC jQuery $.ajax POST 请求不调用控制器方法,但适用于“新鲜”MVC 项目
【发布时间】:2015-12-29 20:14:35
【问题描述】:

在 ASP.NET MVC 项目中,我有一个接受 POST 请求的控制器方法,如下所示(为了完整性,使用“User”类):

[HttpPost]
public ActionResult TestMethod(User user)
{
    return Content("It worked");
}

public class User
{
    public string Name { get; set; }
    public string Email { get; set; }
}

我用 jQuery Ajax 调用这个方法:

$.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: 看起来此问题是由为此项目打开的内容安全策略设置引起的。

【问题讨论】:

标签: javascript jquery ajax asp.net-mvc-4 http


【解决方案1】:

您需要将 [FromBody] 注释放在方法的参数之前。

[HttpPost]
public ActionResult TestMethod([FromBody]User user)
{
    return Content("It worked");
}

ASP.net MVC 框架将使用您在正文中传递的参数来识别方法。

【讨论】:

  • 路由机制不使用请求体来识别要调用的控制器方法,在参数声明中添加FromBody可能只需要强制一种方式绑定参数参数必须来自何处是模棱两可的。不管参数是简单类型还是复杂类型,都可能来自没有FromBody的body。该属性只会影响从被调用方法观察到的参数值,原则上不影响方法定位能力。
【解决方案2】:

我在实施自定义错误后遇到了这个问题,并且我的表单将一个文件发送回服务器,该文件大于允许的最大值。这导致了 404.13 错误...我猜这是“文件太大”的默认错误

打开自定义错误后,我看到的只是 404。当我知道请求类型是帖子并且发布的网址是正确的时,我收到了 404 错误,这让我抓狂。

希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多