【发布时间】: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