2015-06-29 46 views
0

我的一个POST动作是抛出HTTP 404错误。我已经在最近几个小时了,不知道有什么问题!同一控制器中的所有其他操作都可以正常工作。我很确定拼写是正确的。在调试模式下,这种方法从来没有被打(很明显,我猜)。请帮忙。在ASP.NET MVC4中找不到控制器的动作-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.您正在查找的资源(或其中一个>依赖项)可能已被删除,名称已更改或暂时不可用。请检查以下网址并确保它拼写正确。

请求的URL:/ 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和POST问题。 - 当我第一次编译它时,它没有HTTPGet或HTTPPost属性。我不确定ASP.NET MVC4如何确定它应该是什么。无论如何,明确的POST ajax调用失败并开始直接在浏览器中进行测试。浏览器显然是把它发布为GET。我仍然不清楚这是如何确定的,但我猜想将HTTPPost属性添加到控制器是最终修复它的原因。猜猜我会读到ASP.NET和浏览器如何确定操作是GET还是POST。

+0

尝试快速测试:更改此动作以接受GET动词,并尝试通过querystring达到此操作:http:// localhost:60328/LookupTable/AjaxLookupTableCRUDDelete?lookupId = 111, –

+0

@Thiago Custodio - 我只是试着改变要得到。现在它说这是当我将操作改为GET时显示的内容 - “视图'AjaxLookupTableCRUDDelete'或其主控没有被找到或没有视图>引擎支持搜索到的位置。搜索到以下位置:...” – Achilles

回答

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。

您可能要检查的另一件事是在提琴手中正确设置ContentType。

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

刚刚尝试过,就像那样。抛出相同的错误 - 无法找到资源。 描述:HTTP 404.您正在查找的资源(或其某个依赖项)可能已被删除,名称已更改或暂时不可用。请检查以下网址并确保它拼写正确。 请求的URL:/ LookupTable/AjaxLookupTableCRUDDelete/111 – Achilles

+0

您有可能提供您正在发送的Fiddler POST的屏幕截图吗? –

0

变化的行动签名如下:

public ActionResult AjaxLookupTableCRUDDelete(int? id) 
    { 
    } 

这里的想法是有作用的变量名的比赛你已经在你的路线。

文章网址将需要看起来像这样:

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

你不需要提供变量名,因为MVC将基于URL的路线上闪耀它

+0

“POST网址”?也许我在这里错过了一些东西,但是你如何在url中传递参数并期望POST工作? –

+0

@ShaiCohen asp.net mvc将从uri中拉取参数。你不需要有一个表单主体来发布。 – pnm

0

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

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

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

一般情况下,如果有什么不对的地方,就会明白这一点。

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