我有一个ASP.NET MVC应用程序。在应用程序中,我有一堆类似结构的路由用于不同的操作:
/Admin/Addresses/{AddressId}/Delete
/Admin/Phones/{PhoneId}/Delete
/Admin/Notes/{NoteId}/Delete
/Admin/Files/{FileId}/Delete
其中没有一项工作......我现在已经检查了5个小时的路线和行动,我知道它们都按照应有的方式编写,但它仍然是404全部。
有趣的是,以下路线在结构上也很相似,工作得很好:
/Admin/Addresses/{Id}/{Type}
/Admin/Phones/{Id}/{Type}
/Admin/Notes/{Id}/{Type}
/Admin/Files/{Id}/{Type}
两组之间的唯一区别是删除路由使用GET并且应该返回JSON,而其他路由使用POST和重定向。
有没有人遇到过这个?
编辑:根据评论请求,这是一个更大的代码示例。第一个代码示例是唯一的工作路径(这可能是因为它是使用指定url结构的路由列表中的第一个),第二个是行中的下一个路径,它根本不起作用... < / p>
Routes.MapRoute("Administration (Delete Employee)", "Administration/Employees/{EmployeeId}/Delete", new {
controller = "Administration",
action = "DeleteEmployee"
});
[AcceptVerbs(HttpVerbs.Get)]
public JsonResult DeleteEmployee(short EmployeeId) {
try {
db.DeleteEmployee(EmployeeId);
return Json(new IJsonStatus() {
Success = true
});
} catch (Exception ex) {
Shared.LogWarning(ex);
return Json(new IJsonStatus() {
Success = false,
Exception = ex.Message
});
};
}
非工作路线:
Routes.MapRoute("Administration (Delete Address)", "Administration/Addresses/{AddressId}/Delete", new {
controller = "Administration",
action = "DeleteAddress"
});
[AcceptVerbs(HttpVerbs.Get)]
public JsonResult DeleteAddress(int AddressId) {
try {
db.DeleteAddress(AddressId);
return Json(new BaseResponse() {
Success = true
});
} catch (Exception ex) {
Shared.LogWarning(ex);
return Json(new BaseResponse() {
Success = false,
Exception = ex.Message
});
};
}
答案 0 :(得分:1)
查看整个路由映射调用可能非常有用,而不仅仅是一个片段。这些东西非常非常依赖于操作顺序。
其次,查看MVC routing debugger。它有助于解开许多路线神秘问题。
答案 1 :(得分:0)
HTTP POST通常用于请求删除操作。您是否在使用[AcceptVerbs(HttpVerbs.Get)]修饰的这些操作上使用POST?
答案 2 :(得分:0)
尝试将其映射得更像:
RouteTable.Routes.Add(new Route(
"Administration/Forums/{action}/{id}",
new RouteValueDictionary(new { controller = "Forums", action = "Index", id = "" }),
new MvcRouteHandler()));
RouteTable.Routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" });
答案 3 :(得分:0)
我添加了调试器,它匹配两条路径:
Administration/Notes/{Id}/{Type} <--POST
Administration/Notes/{NoteId}/Delete <--GET
所以,我认为它与post路由匹配,因为其中包含Id,它实际上代表CustomerId或EmployeeId,因为它是一个统一的行为,根据类型进行区分。
但是,我原本期望第二条路线上的/ Delete强制它进入实际路线,但我想它会停在第一个匹配参数?