如何将除了一个控制器外的所有控制器路由到“开始”动作,并将所有其他控制器的路由设置为“索引”?

6 浏览
0 Comments

如何将除了一个控制器外的所有控制器路由到“开始”动作,并将所有其他控制器的路由设置为“索引”?

我的主要起始页面是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 }
);

我该如何实现这个?

0
0 Comments

问题的原因是需要将除了一个控制器之外的所有控制器的路由指向'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'动作。

0
0 Comments

问题的原因是希望将所有的控制器路由到“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错误页面。

参考链接提供了有关路由的简介,虽然有点旧,但很好地介绍了基础知识。

0
0 Comments

问题的原因是需要将除一个控制器外的所有控制器都路由到'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"。虽然原始问题没有明确指出这一点,但如果我在一个真实项目中接到这个问题作为需求,我会这样解释它。

0