gpt4 book ai didi

c# - 单独组装和路由中的 Controller

转载 作者:IT王子 更新时间:2023-10-29 04:01:27 24 4
gpt4 key购买 nike

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

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

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

这是我完全没有想到的。我一直认为 ASP.NET MVC 尊重放置 Controller 的命名空间。因此,来自另一个命名空间的 Controller 不会公开,至少在我没有要求之前是这样。

我尝试更改默认路由注册,以使用命名空间参数。

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

不过,ShinnyController 路由仍然匹配 '/shinny'。

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

最佳答案

路由上的命名空间列表只给某些命名空间优先级,而不是其他未列出的命名空间:

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

没有像人们期望的那样给予 Namespace1 更高的优先级,而是给予两个命名空间高于其他命名空间的优先级。

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

你可以通过这样做来抑制非优先 Controller 的使用:

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;

关于c# - 单独组装和路由中的 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11077554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com