MVC 5到同一控制器的多条路由

时间:2019-01-17 21:03:51

标签: asp.net asp.net-mvc asp.net-mvc-5

在我们的RouteConfig.cs文件中,我们具有以下默认路由:

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Original", action = "Index", id = UrlParameter.Optional },
                namespaces: new[] { "Path.To.Controllers" }
            );

我们的应用程序分为几个不同的“区域”。这条特殊的路线工作得很好。

我们被要求更改其中一个URL,但是底层代码库是相同的。为了避免断开现有链接,我想将控制器设置为支持两条不同的路线:

以下是原始网址的示例:

website.com/MyArea/Original

使用上述“默认”路由,它将被定向到OriginalController区域中的MyArea,并且由于未指定任何默认值,因此将执行默认Index动作。 / p>

我的目标是设置另一个URL,该URL也将自己定向到OriginalController。也就是说,

website.com/MyArea/Other

应该路由到OriginalController区域中的MyArea,然后执行默认的Index操作。

我已将以下内容添加到RouteConfig.cs文件中:

            routes.MapRoute(
                name: "Other",
                url: "Other/{action}/{id}",
                defaults: new { controller = "Original", action = "Index", id = UrlParameter.Optional },
                namespaces: new[] { "Path.To.Controllers" }
            );

我发现,{em}总是使用Default路由配置,而倾向于Other路由配置,这会导致绑定问题,说明“ {{1 }}找不到”。我怀疑这是因为它们在OtherController模板中具有非常相似的签名,但是我不确定如何解决这个问题。

我知道也有一个url属性,我不反对使用它。不幸的是,我未能正确地获得该设置。

在研究并尝试了几种不同的组合后,我仍然无法将两个URL都路由到一个控制器。

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

我能够在控制器本身上使用RouteAttribute来获得预期的结果(感谢@Michael的资源,让我再次关注RouteAttribute),而不是常规的MapConfig路由。正如我在上面的问题中所描述的那样,尝试Route方法时遇到了困难,因为我收到404错误,指出“找不到资源”。

事实证明,上述错误是由于我的属性路由未按正确的顺序布线而导致的,这迫使在我的Route属性上使用常规路由(例如Default MapConfig)。

我偶然发现this SO post,其中指出:

  

您可能正在将基于约定的路由与属性结合在一起   路线,并且您应该在绘制地图后注册区域   属性路由。

     

     在此行之后,应将

AreaRegistration.RegisterAllAreas();称为:

     

routes.MapMvcAttributeRoutes();

使用区域时,必须在注册属性路由之后注册那些区域。我最初是在Application_Start的{​​{1}}方法中注册我的区域的,该方法在Globas.asax.cs之前被调用。我将此注册移至RouteConfig.RegisterRoutes文件中MapMvcAttributeRoutes调用的正下方,这使控制器上的以下route属性可以按预期工作:

RouteConfig.cs

有了上述内容,我现在可以导航至以下两个URL之一,这些URL将正确地路由至我的[RouteArea("MyArea")] [Route("Original/{action=index}", Order = 1)] [Route("Other/{action=index}", Order = 0)] public class OriginalController : Controller { ... ... public async Task<ActionResult> Index() { ... } } 的“ Index”操作:

OriginalController

website.com/MyArea/Original

这有效。但是,我确实定义了另一个动作,阻塞了属性路由并导致使用了常规的默认路由(通过MapConfig函数定义)。我的动作签名:

website.com/MyArea/Other

此操作的路由为:public async Task<ActionResult> Details(int id) { ... } ,它也满足website.com/MyArea/Original/Details/123的默认常规路由。

解决此问题的方法是在动作级别上进一步定义路线属性:

{area}/{controller}/{action}/{id}

现在先找到我的路线属性,然后再使用常规路线。