我有一个控制器动作方法,它看起来像这样:
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
此问题似乎是由对此项目有效的内容安全策略设置引起的。
答案 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
- 对象有哪种格式?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
- 属性的对象传递它(请参阅上面的注释)。