如何将除了一个控制器外的所有控制器路由到“开始”动作,并将所有其他控制器的路由设置为“索引”?
如何将除了一个控制器外的所有控制器路由到“开始”动作,并将所有其他控制器的路由设置为“索引”?
我的主要起始页面是ApplicantProfile
,所以我的默认路由如下:
routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "ApplicantProfile", action = "Start", id = UrlParameter.Optional } );
该控制器没有公共访问的索引页面,但其他所有控制器都有。我想要的是通配符等效的路由,例如:
routes.MapRoute( name: "Others", url: "{controller}/{action}/{id}", defaults: new { controller = "*", action = "Start", id = UrlParameter.Optional } );
我该如何实现这个?
问题的原因是需要将除了一个控制器之外的所有控制器的路由指向'Index'动作,而将该控制器的路由指向'Start'动作。
解决方法是使用IRouteConstraint接口来为其他路由添加约束,并将该约束放在具有该约束的默认控制器之前的位置。同时,可以添加一个检查,如果控制器不是ApplicationProfile,则使用该约束。
具体代码如下:
public class ApplicationProfileConstraint : IRouteConstraint { public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) { string controllerName = values["controller"].ToString(); return controllerName != "ApplicationProfile"; } } public static void ConfigureRoutes(IRouteBuilder routeBuilder) { routeBuilder.MapRoute( name: "Default", template: "{controller=ApplicationProfile}/{action=Start}/{id?}", constraints: new { controller = new ApplicationProfileConstraint() } ); }
通过以上代码,除了ApplicationProfile控制器之外的所有控制器将路由到'Index'动作,而ApplicationProfile控制器将路由到'Start'动作。
问题的原因是希望将所有的控制器路由到“Index”操作,只有一个控制器路由到“Start”操作。解决方法是在路由表中添加两个路由规则,一个针对特定的控制器,另一个针对其他控制器。
首先,需要添加一个名为“Default”的路由规则,将URL模式设置为“ApplicantProfile/{action}/{id}”,默认控制器设置为“ApplicantProfile”,默认操作设置为“Start”。这样,当URL为“/ApplicantProfile”时,将路由到“ApplicantProfileController”的“Start”操作。
然后,添加另一个名为“Default”的路由规则,将URL模式设置为“{controller}/{action}/{id}”,默认操作设置为“Index”。这样,当URL为“/Other”时,将路由到“OtherController”的“Index”操作。
如果URL中不包含任何控制器名称或者找不到匹配的控制器,将返回默认的404错误页面。
下面是完整的代码示例:
routes.MapRoute( name: "Default", url: "ApplicantProfile/{action}/{id}", defaults: new { controller = "ApplicantProfile", action = "Start", id = UrlParameter.Optional } ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { action = "Index", id = UrlParameter.Optional } );
假设有ApplicantProfileController、HomeController和OtherController,这将导致以下结果:
- /ApplicantProfile → ApplicantProfileController.Start
- /Other → OtherController.Index
- /SomeOtherPath → 默认的404错误页面
- / → 默认的404错误页面
在路由表中,路由规则是从上到下依次匹配的,意味着它会在第一个匹配到的路由规则处停止。在第一个路由规则中,将首先匹配到ApplicantProfile路由,因此会使用该控制器。在第二个情况中,路径中包含Other,找到了匹配的控制器并使用该控制器。最后两个情况中找不到匹配的控制器,并且没有指定默认的控制器,因此返回默认的404错误。建议为错误设置适当的处理程序。
需要注意的是,在代码示例中并没有指定默认的控制器,因此请求会直接被路由到404错误页面。
参考链接提供了有关路由的简介,虽然有点旧,但很好地介绍了基础知识。
问题的原因是需要将除一个控制器外的所有控制器都路由到'Start'动作,将这个控制器路由到'Index'动作。解决方法是在路由配置中添加两个路由规则,第一个路由规则将指定的控制器路由到'Start'动作,第二个路由规则将所有其他控制器路由到'Index'动作。在第一个路由规则中,'url'参数指定了控制器的URL格式,'defaults'参数指定了默认的控制器和动作,'id'参数是可选的。在第二个路由规则中,'url'参数使用了占位符'{controller}/{action}/{id}'来匹配所有控制器和动作的URL格式,'defaults'参数指定了默认的控制器和动作,'id'参数是可选的。这样配置后,除指定的控制器外的所有控制器都会被路由到'Index'动作。
以下是完整的代码示例:
routes.MapRoute(
name: "ApplicantProfile",
url: "ApplicantProfile/Start/{id}",
defaults: new { controller = "ApplicantProfile", action = "Start", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
第一个路由规则将匹配URL格式为"ApplicantProfile/Start/{id}"的请求,并将其路由到"ApplicantProfile"控制器的"Start"动作。第二个路由规则将匹配所有其他URL格式的请求,并将它们路由到默认控制器"Home"的"Index"动作。
然而,这种解决方案的问题是,它将会将类似于"/ApplicantProfile/Step2"的请求路由到"HomeController"。虽然原始问题没有明确指出这一点,但如果我在一个真实项目中接到这个问题作为需求,我会这样解释它。