控制器在单独的装配和布线中

Ale*_*sky 37 .net c# asp.net asp.net-mvc

在同一个解决方案中,有一个ASP.NET MVC4应用程序Slick.App和类库Awesome.Mvc.Lib.Awesome.Mvc.Lib包含一个控制器类.

public class ShinnyController : Controller
{
    [HttpGet]
    public string Index()
    {
        return "Hello, from Awesome.Mvc.Lib";
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我只是将Slick.App的引用添加到Awesome.Mvc.Lib,运行应用程序并指向浏览器/shinny,我将实际看到响应"Hello,来自Awesome.Mvc.Lib".

这是我根本没想到的.我一直认为ASP.NET MVC尊重控制器所在的命名空间.因此,至少在我没有要求之前,来自其他命名空间的控制器都没有暴露.

我尝试更改默认路由注册,以使用namespaces参数.

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        namespaces: new [] { "Slick.App.Controllers" }
    );
Run Code Online (Sandbox Code Playgroud)

尽管如此,ShinnyController路线仍然匹配'/ shinny'.

我担心这是正确的默认行为.我的问题是,如何明确说明暴露了哪些控制器并阻止默认路由匹配单独的类库中的控制器?

Ven*_*kov 31

路由上的名称空间列表仅优先于某些名称空间而不是其他名称空间:

new [] {"Namespace1", "Namespace2"}
Run Code Online (Sandbox Code Playgroud)

并没有像人们期望的那样给Namespace1提供更高的优先级,但只优先于其他名称空间.

这意味着列表中的命名空间首先搜索控制器,然后,如果找不到匹配项,则使用具有该名称的其余可用控制器.

您可以通过执行以下操作来禁止使用非优先控制器:

var myRoute  = routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        namespaces: new [] { "Slick.App.Controllers" }
    );

myRoute.DataTokens["UseNamespaceFallback"] = false;
Run Code Online (Sandbox Code Playgroud)