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

时间:2015-09-29 13:24:54

标签: asp.net-mvc

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

public ActionResult testMethod(int id)
{
    //do something...
    //return something...
    return View();
}

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

[HttpPost]
public ActionResult testMethod(int id)
{
    //do something...
    //return something...
    return View();
}

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

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

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

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

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

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

我也试过包含一个属性路由描述,比如这个

    [HttpPost]
    [Route("indices/TestMethod/{id:int}")]
    public ActionResult TestMethod(int id)

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

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

打开属性路由,以及URL中的参数值,我在Fiddler中看到首先发生POST请求,获得301状态错误,但随后发出GET请求,这会产生404错误。

更新3: 经过更多的调查后,我将问题定义缩小到足以使打开一个新问题变得合理,可以在这里找到: ASP MVC jQuery $.ajax POST request does not call controller method, but works in "fresh" MVC project

此问题似乎是由对此项目有效的内容安全策略设置引起的。

2 个答案:

答案 0 :(得分:2)

尝试将param1更改为id,看看它是否有效。这可能听起来很愚蠢,但实际上我在自己面前遇到了问题并解决了这个问题。

我能想到的另一个问题是,在您的应用中,testMethod的路径为/Indices/TestMethod,并带有大写字符。当您请求/indices/testMethod/时,可能会发生一些重定向,从而导致GET请求。

尝试更改ajax调用中的url或尝试添加[Route()]属性来设置路由名称。

答案 1 :(得分:0)

您可能需要将FromBody - 属性添加到int param1 - 参数中,因为它是一个简单的类型?有关详细信息,请参阅here

否则预期格式为/indices/testMethod/{param1}的路由(即,即使是POST请求,也需要param在URL中)。可能未定义此路线,即在global.asax.cs中。例如,您可以尝试向/indices/testMethod/1发出POST请求。只是尝试它是否真的是路由问题?

如果您的路由确实存在问题,可以使用Attribute Routing为方法定义特定路由。至少对于测试/开发来说,这样可以更容易地查看/了解为您的方法实际定义的路径。

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

  • dataGoesHere - 对象有哪种格式?
  • 工作的POST方法是什么样的?他们的参数是什么数据类型?参考或价值类型?
  • 您注册了哪些路线(即global.asax.cs)?

<强>更新

我会尝试以下:

定义控制器方法如下:

[HttpPost]
[Route("indices/TestMethod/")]
public ActionResult TestMethod([FromBody] int id)

定义这样的动作调用:

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

尝试将id作为简单值传递或尝试使用带有id - 属性的对象传递它(请参阅上面的注释)。