我想知道这是否可行。假设我有一个单片控制器,ReportController.cs。
我想制作一个完全独立的控制器文件,但仍然将/ Report /保留在我们已经知道并期待的网址中。
我在全球的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中的简单操作时,我都会收到此错误:"值不能为null或为空。参数名称:controllerName"
我误解了它是如何工作的。当你有" {controller} /.."这不是说'寻找任何名为+ controller的控制器并使用它'。所以如果我去... / Report / DoStuff它会在ReportController上查找DoStuff方法吗?
那么我的其他路线是不是只附加一个搜索序列?所以如果我把... / Report / DoStuff它在ReportController和ReportTest上查找DoStuff方法吧?
答案 0 :(得分:4)
路由格式字符串:
{controller}/{action}/{id}
意味着:请求URI的第一部分(“part”是“分割/
之后的元素”)是控制器名称,下一部分是action方法,最后一部分是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)
{
// ...
}
}