.NET的路由引擎中的一个错误?

时间:2009-10-15 23:25:23

标签: asp.net-mvc routing

我有一个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
            });
        };
    }

4 个答案:

答案 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强制它进入实际路线,但我想它会停在第一个匹配参数?