MVC4中相同URL上的路由

本文关键字:路由 URL MVC4 | 更新日期: 2023-09-27 18:21:31

我正在为区域编写路由,但在同一个URL上遇到了问题。这是我的网络结构:

Project Authentication:
AccountController 
|__SignIn
Project Account: 
AccountController 
|__ChangePassword

我写路线:

AccountArea注册的第一条途径:

context.MapRoute(
    "Account_Default",
    "Account/{action}/{id}",
    new
    {
        controller = "Account",
        id = UrlParameter.Optional
    },
    new[] { "MyProject.Account.Controllers" });

身份验证区域注册中的第二条路径:

context.MapRoute(
    "Authentication_Account",
    "Account/SignIn",
    new
    {
        controller = "Account",
        action = "SignIn",
        id = UrlParameter.Optional
    },
    new[] { "MyProject.Authentication.Controllers" });

第一个路由的优先级高于第二个路由,因为在AuthenticationAreaRegistration之前调用了AccountAreaRegulation。

当我打开URL:~/Account/SignIn->I get error Resource not found,因为此URL与第一个路由匹配。如何解决我的问题。谢谢

MVC4中相同URL上的路由

如果你很乐意修改路线模板,你可以这样做:

   public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "Authentication_Account",
            "Authentication/SignIn",
            new
            { 
                controller = "Account",
                action = "SignIn",
                id = UrlParameter.Optional
            },
            new[] { "MyApp.Areas.Authentication.Controllers" });
    }

只修改您的"Authentication_Account"模板使用~/Authentication/SignIn和~/Account/ChangePassword来访问您的操作-只需使URL唯一即可。

如果这还不够好,您可以按不同的顺序调用路由注册函数,以便首先注册更具体的路由——在您的情况下,即"Authentication_Account"路由。您需要手动调用它们,而不是在Global.asax 中使用RegisterAllAreas

您想要相同的前缀url,如Account/…/。。针对不同区域?我不认为这是最好的做法,但如果你真的想要,你可以剪切第二条路线,然后在第一条路线之前粘贴。并让您的AuthenticationAreaRegistration MapRoute为空。

所以你的AccountAreaRegistration应该是这样的:

context.MapRoute(
"Authentication_Account",
"Account/SignIn",
new
{
    controller = "Account",
    action = "SignIn",
    id = UrlParameter.Optional
},
new[] { "MyProject.Authentication.Controllers" });
context.MapRoute(
"Account_Default",
"Account/{action}/{id}",
new
{
    controller = "Account",
    id = UrlParameter.Optional
},
new[] { "MyProject.Account.Controllers" });