添加属性路由会中断基于配置的路由 (.NET MVC5)

Adding attribute route breaks config-based route (.NET MVC5)

因此,我们正在将一个项目从 Web 表单更新到 .NET MVC。为了支持深入 link 到我们的应用程序的其他应用程序,我正在尝试将属性路由添加到模仿旧 Web 表单路径的相关控制器操作。

我在家庭控制器上有一个事件操作。该配置有一个用于删除控制器名称的路由。

routes.MapRoute(
    name: "eventdetails_nohome",
    url: "event/{id}/{occurrenceid}",
    defaults: new { Controller = "Home", action = "Event", occurrenceid = UrlParameter.Optional },
    constraints: new { id = @"\d+", occurrenceid = @"\d+" }
);

该路线适用于 http://myapp/event/123/456 等路线,默认路线 http://myapp/home/event?id=123&occurrenceid=456 也适用。

到目前为止一切顺利,但如果我将此路由属性添加到操作中:

[Route("~/ViewEvent.aspx")]
public ActionResult Event(int id, int occurrenceid)

那么唯一可行的路线是 http://myapp/ViewEvent.aspx?id=91918&occurrenceid=165045。之前有效的路线开始返回

Server Error in '/' Application.

The resource cannot be found.

Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. Please review the following URL and make sure that it is spelled correctly.

Requested URL: /event/123/456

我已经使用了 the routedebugger 扩展,我可以验证即使使用属性路由,我的旧路由仍然是第一个起作用的。那么为什么我会收到“找不到资源”错误?

注意:作为一种解决方法,我发现我可以像

这样进行传统的路由配置
routes.MapRoute(
    name: "Legacy event",
    url: "ViewEvent.aspx",
    defaults: new { Controller = "Home", action = "Event" }
);

我仍然很好奇为什么属性路由会破坏现有路由,因为我认为您应该能够同时使用两者。

看看Attribute Routing in ASP.NET MVC 5

另一篇标题相同的文章

Attribute Routing in ASP.NET MVC 5

属性路由覆盖基于约定的路由。如果你使用多个URL作为动作,你可以在动作上使用多个路由属性...

    [Route("event/{id:int}/{occurrenceid:int}")]
    [Route("event")]
    [Route("~/ViewEvent.aspx")]
    public ActionResult Event(int id = 0, int occurrenceid = 0) {
        return View();
    }

以下 URL 全部路由到上述操作。

http://myapp/event/123/456
http://myapp/home/event?id=123&occurrenceid=456
http://myapp/ViewEvent.aspx?id=91918&occurrenceid=165045