无法创建简单的自定义路由

时间:2011-08-31 14:21:51

标签: asp.net-mvc

我的目标是从该控制器中的任何操作中删除“home”(参见粗体)。

site.com/home/about
site.com/about

site.com/home/contact
site.com/contact

我创建了以下自定义路由,它位于通用基本路由之上:

// Used to hide 'home' in the url
routes.MapRoute(
            "Home", // Route name
            "{action}", // URL with parameters
            new { controller = "home", action= "index"} // Parameter defaults
);

这个几乎做我想要的。我现在得到site.com/about,site.com/contact等。但是,我不能将索引用于其他控制器。

site.com/person/create - >就像一个魅力 site.com/person/ - >不好。

我该如何解决这个问题?感谢。

2 个答案:

答案 0 :(得分:1)

这两条路线应按预期工作:

routes.MapRoute(
   "NoHomeRoute", // Route name
   "{controller}/{action}", // URL with parameters
   new { controller = "Person", action= "Index"}, // Parameter defaults
   new { controller = @"person|admin|..." } // Parameter constraints
);
routes.MapRoute(
   "HomeRoute", // Route name
   "{action}", // URL with parameters
   new { controller = "home", action= "index"} // Parameter defaults
);

由于每个应用程序都有一组预定义的控制器,您可以将除 home 之外的所有控制器放在上限制中,它将起作用。但是如果你创建一个新的控制器,记得也把它放进去。我为你明显拥有的PersonController添加了 person ,并为你可能没有的AdminController添加了 admin ,但我需要提供一些东西来向您展示添加控制器的模式。

如果您愿意使用正则表达式,那么您可能会想出一个排除 home 的解决方案,而不是包含除 home 以外的所有 home 的方式上部路线定义表明。

修订后的负面约束

我检查了MVC代码,实际上你可以用这种方式定义第一个路径定义的未来证明约束:

routes.MapRoute(
   "NoHomeRoute", // Route name
   "{controller}/{action}", // URL with parameters
   new { controller = "Person", action= "Index"}, // Parameter defaults
   new { controller = @"(?!home).*" } // Parameter constraints
);

为什么要这样做?因为ProcessConstraint方法上的行最后有这两行:

string pattern = "^(" + str + ")$";
return Regex.IsMatch(input, pattern, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);

答案 1 :(得分:0)

// Used to hide 'home' in the url
routes.MapRoute(
        "Home", // Route name
        "{action}", // URL with parameters
        new { controller = "home", action= "index"} // Parameter defaults);

应该是您注册的最后一条路线,否则site.com/person会被解释为一个动作,因为它将首先匹配该路线。