带有静态前缀

时间:2015-09-21 13:51:51

标签: asp.net-mvc asp.net-mvc-4 asp.net-routing

我的routeConfig文件中有两条路由,如下所示。

  
      
  1. 使用 admin 前缀路由处理管理部分
  2. 的请求   
  3. 默认没有前缀的路线,为此我添加了一个数据表来映射候选区域
  4. 中的路线   
routes.MapRoute(
                    name: "admin",
                    url: "Admin/{controller}/{action}/{id}",
                    defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional },
                    namespaces: new[] { "abc.namespace1" }
                );

                routes.MapRoute(
                    name: "default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional },
                    namespaces: new[] { "abc.namespace2" }
                ).DataTokens.Add("area", "Candidate");

但问题是当我输入网址 localhost / MyApp / Admin / Home / Index 它击中 abc.namespace1 (预期)中的控制器, localhost / MyApp / Home / Index 也击中 abc.namespace1 而不是候选区域 abc.namespace2 内的HomeController。

我想要做的是处理带有管理员前缀的所有路由,其中​​ abc.namespace1 内有控制器,所有路径都没有任何带有 abc.namespace2 内部控制器的前缀,这是我的 Candiate Area

问候

1 个答案:

答案 0 :(得分:0)

我认为这可能与您指定命名空间的方式有关。命名空间必须是控制器类所在的位置。

模式通常是<namespace of area>.<area name>.<controller namespace>

例如,在名为&#34; Admin&#34;的区域的项目中,名称空间必须为:

"MvcMusicStore.Areas.Admin.Controllers"

根据我的经验,关于如何设置区域的约定非常严格。您不应该在AreaRegistration而不是项目的根目录中设置路线,以使其发挥作用。

public class CandidateAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Candidate";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Candidate_default",
            "{controller}/{action}/{id}",
            new { controller = "Account", action = "Login", id = UrlParameter.Optional },
            new string[] { "<project name>.Areas.Candidate.Controllers" }
        );
    }
}

区域是基于惯例的。如果你偏离预期的约定太远,他们就不会发挥作用。