【问题标题】:C# URL Routing with variable parameters带有可变参数的 C# URL 路由
【发布时间】:2017-11-12 18:53:11
【问题描述】:

我在两个单独的控制器中有两个方法,我想访问它们,但似乎无法弄清楚自定义路由应该是什么样子,以及是否可以在不手动编写所有路由的情况下做到这一点。

我想要达到的目标:

baseUrl/businessOwner/identity

映射到 BusinessOwnerController,身份操作

baseUrl/{employee}/identity

映射到 EmployeeController、Identity 操作

其中 {employee} 将是一个字符串,我与数据库中的值匹配。 另外,我希望其他 URL 能够将自己映射到它们的默认行为,例如:

baseUrl/accountant/identity 

不会匹配之前的路由,但会转到默认行为:accountant - AccountantController,Identity action。

唯一可行的方法(据我所知)是在 RegisterRoutes 中手动映射路线。

我尝试过自定义路线:

routes.MapRoute(
"BusinessOwner",
"businessOwner/{action}/{id}",
new { controller = "BusinessOwner", action = "Identity", id = UrlParameter.Optional }
);

在默认路由之前,但这并没有真正奏效,因为仍然会弹出“多个控制器匹配”错误。

我也尝试将控制器分离到同一个 Controllers 文件夹中的不同命名空间中,并基于此进行路由,但仍然不成功。

有什么想法吗?

【问题讨论】:

    标签: c# .net routes


    【解决方案1】:

    这样看:您使用 URL 的同一部分来保存员工标识符或字符串常量“BusinessOwner”,它充当魔术字符串来调用 BusinessOwnerController 而不是 EmployeeController。

    设置你的主要路由总是去EmployeeController,然后在EmployeeController中添加一个特殊的检查,如果检测到“BusinessOwner”这个特殊的员工ID,它将把控制权传递给BusinessOwnerController。

    class EmployeeController : Controller
    {
        public ActionResult Identity(string employeeID)
        {
            if (employeeID == "BusinessOwner")
            {
                var businessOwnerController = new BusinessOwnerController();
                businessOwnerController.ControllerContext = new ControllerContext(
                    this.ControllerContext.RequestContext,
                    businessOwnerController
                );
                return businessOwnerController.Identity();
            }
            else
            {
                //Do employee stuff
            }
        }
    }
    

    【讨论】:

    • 但这意味着在EmployeeController中实例化BusinessOwnerController,我认为这不是一个好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 2014-04-13
    • 2018-08-31
    • 2015-10-06
    • 2011-01-18
    • 2023-03-03
    相关资源
    最近更新 更多