Asp.net mvc 带静态前缀的MVC路由

Asp.net mvc 带静态前缀的MVC路由,asp.net-mvc,asp.net-mvc-4,asp.net-routing,Asp.net Mvc,Asp.net Mvc 4,Asp.net Routing,我的routeConfig文件中有两条路由,如下所示 带有admin前缀的路由,用于处理管理员部分的请求 没有前缀的默认路由,我为其添加了一个datatoken以映射候选区域中的路由 但问题是当我键入urllocalhost/MyApp/Admin/Home/Index 它在abc.namespace1中点击控制器(这是预期的),并且localhost/MyApp/Home/Index也在abc.namespace1中点击主控制器,而不是候选区域中的abc.namespace2 这里我要做的是处

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

  • 带有admin前缀的路由,用于处理管理员部分的请求
  • 没有前缀的默认路由,我为其添加了一个datatoken以映射候选区域中的路由
  • 但问题是当我键入urllocalhost/MyApp/Admin/Home/Index 它在abc.namespace1中点击控制器(这是预期的),并且localhost/MyApp/Home/Index也在abc.namespace1中点击主控制器,而不是候选区域中的abc.namespace2

    这里我要做的是处理所有带有Admin前缀的路由,其中包含abc.namespace1中的控制器,以及所有不带任何前缀的路由,其中包含abc.namespace2中的控制器,这是我的candiate区域


    关于

    我相信这可能与您指定名称空间的方式有关。命名空间必须是控制器类驻留的位置

    模式通常是

    例如,在一个区域名为“Admin”的项目中,命名空间必须是:

    "MvcMusicStore.Areas.Admin.Controllers"
    
    根据我的经验,关于如何设置区域的约定相当严格。您不应在
    区域注册
    中设置路线,而应在项目的根目录中设置路线,以使其正常工作

    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" }
            );
        }
    }
    
    公共类候选人注册:区域注册
    {
    公共重写字符串区域名
    {
    得到
    {
    返回“候选人”;
    }
    }
    公共覆盖无效注册表区域(AreaRegistrationContext上下文)
    {
    context.MapRoute(
    “候选人默认值”,
    “{controller}/{action}/{id}”,
    新建{controller=“Account”,action=“Login”,id=UrlParameter.Optional},
    新字符串[]{.Areas.Candidate.Controllers“}
    );
    }
    }
    
    这些领域以公约为基础。如果你偏离预期的惯例太远,它们根本就不起作用

    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" }
            );
        }
    }