多个控制器,相同的控制器名称

本文关键字:控制器 | 更新日期: 2023-09-27 18:32:14

我想知道这是否可能。假设我有一个整体式控制器,ReportController.cs。

我想制作一个完全独立的控制器文件,但仍然将/Report/保留在我们了解和期望的 url 中。

我在我的全球 asax 中尝试过这个:

routes.MapRoute(
    "Testing", // Route name
    "{test}/{action}/{id}" // URL with parameters
);

我添加了一个名为 ReportTest 的新控制器.cs

原始路线如下所示:

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "LandingPage", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

每次我尝试调用我在ReportTest中的简单操作时.cs我都会收到此错误:"值不能为空或空。参数名称:控制器名称"

我是否误解了这是如何工作的。当您有"{控制器}/.."时,这并不是说"查找任何名为+控制器的控制器并使用它"。因此,如果我转到.../Report/DoStuff,它会在ReportController上查找DoStuff方法,对吗?

那么我的其他路线不会只是附加一个搜索序列吗?因此,如果我输入.../Report/DoStuff,它将在ReportController和ReportTest上查找DoStuff方法,对吗?

多个控制器,相同的控制器名称

路由格式字符串:

{controller}/{action}/{id}

表示:请求 URI 的第一部分("部分"是"拆分后的元素/")是控制器名称,下一部分是操作方法,最后一部分是 ID。

占位符{controller}{action}很特别。因此,您的路由{test}/{action}/{id}不会找到任何控制器,因为没有指定任何控制器,{test}没有任何意义。(确实如此,它将被添加为名为"test"的路由属性,并分配一个表示请求 URI 该部分的值,因此这与此方案无关)。

如果要将 URI 路由到 URI 中未提及的控制器,则必须从字面上指定前缀以及应路由到的控制器。

因此,您的路由将如下所示:

routes.MapRoute(
    "SecondReportController", 
    "Report/NotOnReportController/{id}",
    new { controller = "NotAReportController" }
);
routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "LandingPage", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

然后,您可以使用以下控制器:

public class NotAReportController : Controller
{
    public ActionResult NotOnReportController(int id)
    {
        // ...
    }
}

当然,您也可以改用属性路由:

public class NotAReportController : Controller
{
    [Route("Report/NotOnReportController/{id}")]
    public ActionResult NotOnReportController(int id)
    {
        // ...
    }
}