【问题标题】:Adding attribute route breaks config-based route (.NET MVC5)添加属性路由会中断基于配置的路由 (.NET MVC5)
【发布时间】:2016-09-04 16:38:40
【问题描述】:

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

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

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。开始返回之前有效的路线

“/”应用程序中的服务器错误。

找不到资源。

描述:HTTP 404。您要查找的资源(或其依赖项之一)可能已被删除、名称已更改或暂时不可用。请检查以下 URL 并确保其拼写正确。

请求的网址:/event/123/456

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

注意:作为一种解决方法,我发现我可以做一个传统的路由配置,比如

routes.MapRoute(
    name: "Legacy event",
    url: "ViewEvent.aspx",
    defaults: new { Controller = "Home", action = "Event" }
);

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

【问题讨论】:

  • 那是因为属性路由覆盖了基于约定的路由。您将需要在操作上使用多个路由属性。我在移动设备上,一回到我的工作站就会发布答案。

标签: asp.net asp.net-mvc routes asp.net-mvc-routing


【解决方案1】:

看看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

【讨论】:

  • 你说的很对。如果我从基于约定的路由定义中删除事件操作路由并仅使用属性路由,那么一切正常。我曾认为属性路由和约定路由完美和谐地生活在一起,因为您调用 .MapMvcAttributeRoutes() 方法来指示它们在层次结构中的位置。那好吧。我现在只使用所有约定路线,但很高兴知道我们将来是否将应用程序移动到属性路线。
猜你喜欢
  • 1970-01-01
  • 2016-05-23
  • 2016-01-12
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 2015-10-05
  • 2023-04-10
相关资源
最近更新 更多