【问题标题】:How do I route all but only one controller to the 'Start' action, and routes for all other controllers to 'Index'?如何将除一个控制器之外的所有控制器路由到“开始”操作,并将所有其他控制器路由到“索引”?
【发布时间】:2013-01-16 20:17:33
【问题描述】:

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

我怎样才能做到这一点?

【问题讨论】:

  • 任何答案对您有用吗?如果没有,您能发布一下您是如何解决的吗?
  • 我实际上还没有机会进行实验。我已经介入了更高优先级的任务,但我很快就会回到这个问题上。

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing


【解决方案1】:

默认应该转到带有启动操作的配置文件控制器,所有其他请求都应该到达索引操作,无论控制器是什么。

使用 IRouteConstraint 将约束添加到其他路由的 URL,并将其放置在默认控制器之上,并将约束放在控制器的路由上。

你可以添加一个检查控制器是否是ApplicationProfile使用它。

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这应该照顾它:

    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 }
    );
    

    假设您有申请人ProfileController、HomeController 和OtherController,这将导致:

    • /ApplicantProfile →ApplicantProfileController.Start
    • /Other → OtherController.Index
    • /SomeOtherPath → 默认 404 错误页面
    • / → 默认404错误页面

    有关路由的介绍,请参阅http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/asp-net-mvc-routing-overview-cs。它有点旧,但它很好地涵盖了基础知识。

    路由自上而下发生,这意味着它在路由表中的第一个匹配项处停止。在第一种情况下,您将首先匹配您的申请者配置文件路由,以便使用控制器。第二种情况从路径中获取 Other,找到匹配的控制器并使用它。最后 2 个没有找到匹配的控制器,并且没有指定默认值,因此返回默认的 404 错误。我建议为错误放置一个适当的处理程序。查看答案herehere

    【讨论】:

    • 不,我没有这样的OtherDefaultController。我希望请求转到 URL 中包含的任何控制器。
    • @ProfK 我编辑了我的回复,希望能让事情更清楚。
    • @ColinYoung 我没有也不想要 Home 控制器,但看起来我必须敲入一些东西。也许只是一个带有调用错误页面操作的控制器。
    • @ProfK 我用一个经过测试的示例更新了代码示例,该示例未指定默认控制器,只会陷入 404 错误。
    【解决方案3】:

    这应该根据您的要求工作

    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,另一个是默认将“Home”控制器替换为您的默认控制器

    【讨论】:

    • 这个解决方案的问题是它会路由例如/ApplicantProfile/Step2 到HomeController。最初的问题并没有明确说明这一点,但如果我在实际项目中被要求提出这个问题,那我就是这样解释的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多