none
MVC 4下 area 路由问题 RRS feed

  • 问题

  • 如下是我建立的默认路由

            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                //
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "User", action = "Index", id = UrlParameter.Optional },
                    namespaces: new string[] { "T2013_A.Areas.Users.Controllers" }
                ).DataTokens.Add("Area", "Users");
            }

    我把最初建立MVC4项目自动生成的control/model/view文件夹都删除了,添加两个areas区域,一个是UserManage, 一个是Users

    命名空间分别对应:T2013_A.Areas.UserManage.Controllers与T2013_A.Areas.Users.Controllers

    这两个区域下有一相同的控制器UserController(注意此处,只是命名空间不同,但是有相同的控制器)

    启动程序,系统会自动定位到Users区域下的页面;(注意此时路由的命名空间);

    我改动默认路由如下:

            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                //
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "User", action = "Index", id = UrlParameter.Optional },
                    namespaces: new string[] { "T2013_A.Areas.Users.Controllers" }
                ).DataTokens.Add("Area", "UserManage");
            }

    系统会自动定位到UserManage区域下的页面;(注意此时路由的命名空间);

    我注意到路由下的命名空间无论我写"T2013_A.Areas.UserManage.Controllers"还是"T2013_A.Areas.Users.Controllers"都不影响程序,于是我把默认路由改为如下:

            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                //
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "User", action = "Index", id = UrlParameter.Optional }
                ).DataTokens.Add("Area", "UserManage");
            }

    系统出错了,信息为:

    找到多个与名为“User”的控制器匹配的类型。如果为此请求(“{controller}/{action}/{id}”)提供服务的路由在搜索匹配此请求的控制器时没有指定命名空间,则会发生此情况。如果是这样,请通过调用含有 'namespaces' 参数的 'MapRoute' 方法的重载来注册此路由

    这是为什么啊,即然

    DataTokens.Add("Area", "UserManage");

    可以定位区域,那么

     namespaces: new string[] { "T2013_A.Areas.Users.Controllers" }

    应该没有任何意义啊,为什么删除不行呢?

    如果不删除,把默认命名空间写为

     namespaces: new string[] { "T2013_A.Areas.Users.Controllers" }

     namespaces: new string[] { "T2013_A.Areas.UserManage.Controllers" }

    都不会影响定位页面,也就是说

    DataTokens.Add("Area", "UserManage");

    会定位到UserManage区域,

    DataTokens.Add("Area", "UserManage");

    会定位到Users区域

    请问,namespaces参数为什么不能删除


    大其心,可容天下之物; 虚其心,可受天下之善;



    • 已编辑 lfofiug 2013年3月22日 8:04
    2013年3月22日 7:48

答案