在MVC4中在相同的URL上路由

时间:2014-09-11 01:36:40

标签: c# .net asp.net-mvc routing

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

Project Authentication:
AccountController 
|__SignIn

Project Account: 
AccountController 
|__ChangePassword

我写路线:

AccountAreaRegistration中的第一条路线:

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

AuthenticationAreaRegistration中的第二条路线:

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

第一条路线优先于第二条路线,因为在AuthenticationAreaRegistration之前调用了AccountAreaRegistration。

当我打开网址时:〜/帐户/登录 - >我收到错误资源未找到,因为此URL与第一个路由匹配。如何解决我的问题。感谢。

2 个答案:

答案 0 :(得分:1)

你想要不同区域的帐户/.../ ..相同的前缀网址? 我不认为这是最好的做法,但如果你真的想要它,你可以削减第二条路线并在第一条路线之前粘贴它。并让您的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" });

答案 1 :(得分:1)

如果您乐意修改路线模板,可以执行以下操作:

   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访问您的操作 - 只需将网址设为唯一。

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