在ASP.NET MVC4中找不到控制器的操作 - HTTP 404错误

时间:2015-06-29 17:29:09

标签: asp.net-mvc post

我的一个POST操作是抛出HTTP 404错误。我最近几个小时都在这里,不知道出了什么问题!同一控制器中的所有其他操作都可以正常工作。我很确定拼写是正确的。在调试模式下,这种方法永远不会被击中(好吧,显然我猜)。请帮忙。

这是行动方法 -

public class LookupTableController : Controller
{
[HttpPost]
    public ActionResult AjaxLookupTableCRUDDelete(int lookupId)
    {
        LookupTable lookuptable = db.LookupTables.Find(lookupId);
        if (lookuptable != null)
        {
            db.LookupTables.Remove(lookuptable);
            db.SaveChanges();
        }
        return Index();
    }

无论我如何尝试访问它,它都会抛出404错误!

我直接在浏览器上试用了http://localhost:60328/LookupTable/AjaxLookupTableCRUDDelete/?lookupId=111

显示 -

>Server Error in '/' Application.
  

无法找到资源。   说明:HTTP 404.您要查找的资源(或其某个>依赖项)可能已被删除,名称已更改,或暂时>不可用。请查看以下网址,并确保正确拼写>

     

请求的网址:/ LookupTable / AjaxLookupTableCRUDDelete /

Fiddler -

  

标题 - POST / LookupTable / AjaxLookupTableCRUDDelete?lookupId = 13 HTTP / 1.1 [HttpException]: A public action method 'AjaxLookupTableCRUDDelete' was >not found on controller 'GBPReconTool.Controllers.LookupTableController'.

路由是标准的 -

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

已解决 - 谢谢大家,结果证明是GET vs POST问题。 - 当我第一次编译它时,它没有HTTPGet或HTTPPost属性。我不确定ASP.NET MVC4如何确定它应该是什么。在任何情况下,显式POST ajax调用失败并开始直接在浏览器中测试它。浏览器显然是将其发布为GET。我还不清楚这是如何确定的,但我想将HTTPPost属性添加到控制器是最终解决它的问题。猜猜我会读到ASP.NET和浏览器如何确定一个动作是GET还是POST。

3 个答案:

答案 0 :(得分:0)

尝试使用此...

[HttpPost]
public ActionResult AjaxLookupTableCRUDDelete(int id)
{
    LookupTable lookuptable = db.LookupTables.Find(id);
    if (lookuptable != null)
    {
        db.LookupTables.Remove(lookuptable);
        db.SaveChanges();
    }
    return Index();
}

然后尝试使用...

POST http://localhost:60328/LookupTable/AjaxLookupTableCRUDDelete/111

正如其他人所说,您需要确保将请求作为POST发送。

您可能想要检查的另一件事是在Fiddler中正确设置了ContentType。

Content-Type: application/json; charset=utf-8

答案 1 :(得分:0)

将操作签名更改为以下内容:

    public ActionResult AjaxLookupTableCRUDDelete(int? id)
    {
    }

这里的想法是让动作变量名称与您在路线中已有的名称相匹配。

POST网址需要如下所示:

    http://localhost:60328/LookupTable/AjaxLookupTableCRUDDelete/111

您不需要提供变量名称,因为mvc会根据您的路线从网址中删除它

答案 2 :(得分:0)

我知道这听起来很简单,但是:

  • 确保您保存了类文件
  • 确保构建项目

然后使用Chrome或FireFox开发工具(F12)并查看“网络”标签。您可以查看传递给应用程序的实际URL和类型(POST,GET)。您还将看到任何查询字符串参数和表单数据。

一般来说,如果出现问题,就会明白这一点。

仅供参考 - 您也可以使用Fiddler2来查看实际的http请求。