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

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

如果我加上Slick的参考资料.应用程序太棒了.Mvc.Lib,运行应用程序并将浏览器指向/shinny,我将看到响应"Hello,from 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" }
    );

尽管如此,ShinnyController路由仍然与"/shinny"匹配.

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

推荐答案

路由上的名称空间列表仅为某些名称空间提供priority个,而其他名称空间未列出:

new [] {"Namespace1", "Namespace2"}

没有像人们预期的那样为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;

Asp.net相关问答推荐

如何在 ASP.NET 中以 'YYYY-MM-DD' 格式获取当前日期?

VS2012 中无法识别的标签前缀或设备过滤器asp

如何使用特定视图(不是控制器名称)返回 ActionResult

下载功能在 asp.net 的更新面板中不起作用

IIS 将旧用户名返回到我的应用程序

返回 JSON 对象 (ASP.NET WebAPI)

无法加载文件或程序集 'System.Web.Mvc,版本 = 3.0.0.0,Elmah.MVC 问题

如何使用三个按钮是否和取消显示确认alert ,如 MS Word 中所示

如何更改 .ASPX 自动格式化设置 (Visual Studio)

如何在 ASP.NET Web API 中使用非线程安全的 async/await API 和模式?

使用 ASP.NET WebForms 的 jQuery DataTables 服务器端处理

如何在 ASP.NET 中仅在调试模式下执行代码

如何从 Asp.net Mvc-3 发送邮箱?

如何获取 ASP.NET 应用程序的完整虚拟路径

什么是实体框架中的复杂类型以及何时使用它?

回发后 Document.Ready() 不起作用

如何在 ASP.Net Gridview 中添加确认删除选项?

为什么混合 Razor Pages 和 VueJs 是一件坏事?

x-powered by是什么意思?

Facebook 连接和 ASP.NET