使用[HttpPost]修饰时,ASP MVC控制器操作'404 not found'错误

Pro*_*Joe 8 asp.net-mvc

我有一个控制器动作方法,它看起来像这样:

public ActionResult testMethod(int id)
{
    //do something...
    //return something...
    return View();
}
Run Code Online (Sandbox Code Playgroud)

但是当我指定它应该是一个"Post"方法时,我得到一个'404 not found error':

[HttpPost]
public ActionResult testMethod(int id)
{
    //do something...
    //return something...
    return View();
}
Run Code Online (Sandbox Code Playgroud)

我在同一个控制器中有其他控制器动作方法 - POST和GET,它们工作正常.但这一个不?这是怎么回事?(我确定我在这里遗漏了一些明显的东西...)

更新:ajax调用请求控制器方法:var id = 1;

$.ajax({
    url: '/indices/testMethod/',
    data: id,
    type: 'POST',
    success: function (data) {
        //Do something
    }
});
Run Code Online (Sandbox Code Playgroud)

我也尝试用Postman测试方法,确保发送POST请求.

更新2:我已经尝试将参数更改为id,并尝试确保所有方法和url位置都大写以匹配,但没有任何影响.

在Fiddler中,我可以看到实际上正在进行GET请求,即使我在ajax调用中指定了POST请求,所以现在我需要找出为什么请求最终作为GET而不是POST发送.

我也尝试过包含属性路由描述,就像这样

    [HttpPost]
    [Route("indices/TestMethod/{id:int}")]
    public ActionResult TestMethod(int id)
Run Code Online (Sandbox Code Playgroud)

然后用不同的url尝试了ajax调用:

$.ajax({
    url: '/indices/TestMethod/1',
    data: id,
    type: 'POST',
    success: function (data) {
        var tr = 123;
        var yr = data;
        //Do something
    }
});
Run Code Online (Sandbox Code Playgroud)

使用属性路由和URL中的参数值,我在Fiddler中看到首先发生POST请求,它获得301状态错误,但随后也发出GET请求,这会得到404错误.

更新3:经过更多调查后,我将问题定义缩小到足以使得开启一个新问题是有意义的,可以在这里找到: ASP MVC jQuery $ .ajax POST请求不调用控制器方法,但在"新鲜"MVC中工作项目

此问题似乎是由此项目处于活动状态的内容安全策略设置引起的.

PzY*_*Yon 1

您可能需要将FromBody- 属性添加到 - 参数,int param1因为它是一个简单类型?请参阅此处了解更多信息。

否则,需要采用该格式的路由/indices/testMethod/{param1}(即参数必须位于 URL 中,即使它是 POST 请求)。该路由可能未定义,即在您的global.asax.cs. /indices/testMethod/1例如,您可以尝试发出 POST 请求。只是想试试是否真的是路由问题?

如果您的路由确实有问题,您可以使用Attribute Routing为您的方法定义特定路由。至少对于测试/开发而言,因为这可以更轻松地查看/理解实际为您的方法定义的路由。

一些需要缩小范围的其他问题,它实际上可能是什么:

  • 你的对象有什么格式dataGoesHere
  • 有效的 POST 方法是什么样的?他们的参数是什么数据类型?引用类型还是值类型?
  • 您注册了哪些路线(即在 中global.asax.cs)?

更新

我会尝试以下操作:

像这样定义控制器方法:

[HttpPost]
[Route("indices/TestMethod/")]
public ActionResult TestMethod([FromBody] int id)
Run Code Online (Sandbox Code Playgroud)

像这样定义操作调用:

$.ajax({
    url: '/indices/TestMethod/',
    data: id, // alternatively try: {id: id}
    type: 'POST',
    success: function (data) { }
});
Run Code Online (Sandbox Code Playgroud)

尝试将其id作为简单值传递,或者尝试将其与带有 -property 的对象一起传递id(请参阅上面的注释)。