在我们的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都路由到一个控制器。
我在做什么错了?
答案 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}
现在先找到我的路线属性,然后再使用常规路线。