多个控制器,相同的控制器名称
本文关键字:控制器 | 更新日期: 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)
{
// ...
}
}