构建我的第一个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]
似乎是正确的做。事实上,一旦我这样做,就找到了路线并执行了行动。
答案 0 :(得分:6)
我认为您的问题是ActionLink使用HTTP GET并且您只接受HTTP POST。
您可能需要更改视图以发出HTTP POST(例如,在表单中使用常规HTML按钮),以便浏览器发送的动词与您在控制器上接受的动词匹配。