ActionLink 404错误

时间:2011-08-22 15:05:57

标签: asp.net asp.net-mvc asp.net-mvc-3

构建我的第一个ASP.NET MVC 3应用程序并尝试实现从菜单中取消给定冰淇淋的能力。每个都有一个与之关联的整数标识符,在页面上我显示这些映射并提供链接,以便从菜单中删除冰淇淋。

我有ActionLink看起来像这样:

@Html.ActionLink("Remove", "RemoveMenuIceCreamMapping", "IceCream", new { iceCreamId=item.IceCreamId, menuId=item.MenuId}, null)

在我的IceCreamController中,我有一个看起来像这样的动作:

[HttpPost]
public PartialViewResult RemoveMenuIceCreamMapping(int iceCreamId, int menuId)
{
   ...
}

进行了一些搜索并相信我可能需要修改Global.asax.cs文件routes中的RegisterRoutes来处理这两个参数。所以我试着这样做:

public static void RegisterRoutes(RoutesCollection routes)
{
   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

   // I added this route in an attempt to handle the two parameters:
   routes.MapRoute(
      "RemoveMenuIceCreamMapping", // Route name
      "IceCream/RemoveMenuIceCreamMapping/{iceCreamId}/{menuId}", // URLwith parameters
      new
      {
         controller = "IceCream",
         action = "RemoveMenuIceCreamMapping",
         iceCreamId = UrlParameter.Optional,
         menuId = UrlParameter.Optional
      } 
   );

   // this was there by default
   routes.MapRoute(
      "Default",
      "{controller}/{action}/{id}",
      new {controller = "Home", action = "Index", id = UrlParameter.Optional }
   };
}

但是这不起作用 - 我得到了“资源无法找到”。错误,404。请求的URL:/ IceCream / RemoveMenuIceCreamMapping / 1/10

1是IceCream的Id,10是菜单的Id。

我期待发生的是动作RemoveMenuIceCreamMapping会被调用,传递这两个参数,但我显然没有在这里做某事,可能只是误解了如何完成我想要的事情并且要去这是错误的方式。任何指导都将非常感激。


更新

所以,在我阅读this SO question之后,我学到了另一件事,我的ActionLink没有触发POST,因此从动作中删除[HttpPost]似乎是正确的做。事实上,一旦我这样做,就找到了路线并执行了行动。

1 个答案:

答案 0 :(得分:6)

我认为您的问题是ActionLink使用HTTP GET并且您只接受HTTP POST。

您可能需要更改视图以发出HTTP POST(例如,在表单中使用常规HTML按钮),以便浏览器发送的动词与您在控制器上接受的动词匹配。