Asp.net mvc 创建简单自定义路由时遇到问题

Asp.net mvc 创建简单自定义路由时遇到问题,asp.net-mvc,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 wit

我的目标是从该控制器中的任何操作中删除“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/->不好


我怎样才能解决这个问题?谢谢。

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

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,您显然已经输入了
PersonController
,并且为
AdminController
添加了admin,您可能还没有,但我需要输入一些内容来向您展示添加控制器的模式

如果您愿意使用正则表达式,那么您可能会想出一个排除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);

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

尝试时,我无法使其工作。“我确信这是不可能的,所以看到它工作会很有趣。”罗伯特谢谢你的回答,但不幸的是,这不起作用。它的行为与我的尝试完全相反。换句话说,site.com/person可以工作,但site.com/about(在家庭控制器中)不能工作。@Beavis:我已经用一个有效的解决方案更新了我的答案。我应该检查正则表达式约束是如何工作的,以确切了解我上次尝试失败的原因。@Robert,谢谢,这是有效的。问题是我不明白它是怎么做的/为什么做的。使用您的示例,我可以删除“admin”,但admin仍然有效。奇怪。@Beavis:你可以加入像admin这样的伪控制器约束,它仍然可以工作,因为正则表达式不会匹配它们。但是如果您确实有一个
AdminController
,并且您删除了admin,那么它就不应该再工作了。除非您有
HomeController.Admin
操作方法。
// Used to hide 'home' in the url
routes.MapRoute(
        "Home", // Route name
        "{action}", // URL with parameters
        new { controller = "home", action= "index"} // Parameter defaults);