区域和路由

时间:2012-09-04 23:11:10

标签: c# asp.net-mvc-3-areas

我很困惑我可能会说在网站上发现所有其他帖子。

我的解决方案有两个区域Front和Back,我不想使用默认提供的默认根控制器和视图。

我的 FrontAreaRegistration.cs 就像:

public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        "Front",
        "Front/{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        , new[] { "Show.Areas.Front.Controllers" }
    );
}

我的 BackAreaRegistration.cs 就像:

public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        "Back_default",
        "Back/{controller}/{action}/{id}",
        new { controller = "Account", action = "LogOn", id = UrlParameter.Optional }
        , new[] { "Show.Areas.Back.Controllers" }
    );
}

Global.asax 喜欢:

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

获得以下异常:

  

发现多个类型与名为“Home”的控制器匹配。这个   如果为此请求提供服务的路由可能会发生   ('{controller} / {action} / {id}')未指定要搜索的命名空间   对于匹配请求的控制器。如果是这种情况,   通过调用'MapRoute'方法的重载来注册此路由   它采用'名称空间'参数。

     

'Home'的请求找到了以下匹配的控制器:   Show.Areas.Front.Controllers.HomeController   Show.Areas.Back.Controllers.HomeController

问题是我无法从Front区域到达Home控制器。即使将正确的命名空间添加到context.MapRoute方法重载......

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

引发错误是因为您未在请求中指定区域名称。正因为如此"默认"路由(来自Global.asax)匹配请求并尝试搜索"索引" " Home"的行动控制器。至于两个匹配(对于两个区域),抛出异常。
解决这个问题的方法很少。一种可能是修改Global.asax:

routes.MapRoute(
   "Default", // Route name
   "{controller}/{action}/{id}", // URL with parameters
   new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
   new[] { "Show.Areas.Front.Controllers" }
).DataTokens.Add("Area", "Front");

但在这种情况下"默认"路线仅适用于前区。