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

时间:2016-01-28 14:36:15

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我想知道这是否可行。假设我有一个单片控制器,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方法吧?

1 个答案:

答案 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)
    {
        // ...
    }
}