因此,我们正在将项目从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.您正在查找的资源(或其中一个依赖项)可能已被删除,名称已更改或暂时不可用。请查看以下网址,确保拼写正确。
请求的网址:/ event / 123/456
我已使用the routedebugger扩展程序,我可以验证即使使用属性路由,我的旧路由仍然是第一个工作。那么为什么我会得到资源?#34;资源无法找到"错误?
注意:作为一种解决方法,我发现我可以执行传统的路由配置,例如
routes.MapRoute(
name: "Legacy event",
url: "ViewEvent.aspx",
defaults: new { Controller = "Home", action = "Event" }
);
我仍然很好奇为什么属性路线会破坏现有路线,因为我认为你应该可以同时使用两者。
答案 0 :(得分:2)
查看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();
}
以下网址全部路由到上述操作。
http://myapp/event/123/456
http://myapp/home/event?id=123&occurrenceid=456
http://myapp/ViewEvent.aspx?id=91918&occurrenceid=165045