【问题标题】:ASP.Net MVC Controller Namespace arrayASP.Net MVC 控制器命名空间数组
【发布时间】:2009-04-06 14:26:38
【问题描述】:

我注意到 MapRoute 扩展包含一个接受称为“命名空间”的字符串 [] 参数的重载。我阅读了 Google 为我提供的内容,据说这是为了帮助框架在原本不会看到的地方找到控制器。

我做了一些设置,并尝试将控制器放在奇怪的位置。我在 Scripts 文件夹中放了一个;我什至在具有单独根命名空间的单独程序集中构建了一个。

没有在命名空间参数中添加任何内容,一切正常。如果我只将其中一个命名空间放在命名空间参数中,它仍然可以找到我的所有控制器。我想也许它会使用该数组来消除类似命名的控制器之间的歧义,但这也没有发生。 MyProj.Controllers 中的 HomeController 和 SomeOtherName.Stuff 中的 HomeController 仍会发生冲突。

所以我的问题是,该参数是否已弃用?还是它仍然以某种我尚未辨别的方式使用?

【问题讨论】:

    标签: asp.net-mvc routing


    【解决方案1】:

    好的,经过进一步测试,我发现它不是过滤器,确切地说,但它也是。即使你有部分错误,我也给了你“答案”的功劳。

    所以,它的行为毕竟就像我认为的那样,也就是说它消除了歧义。基本上,逻辑流程是这样的:

    • 在 _cache 中查找与命名空间数组中匹配的命名空间
      • 如果找到,请查找名称正确的控制器
      • --如果找到,返回它
      • -- 如果没有找到,则返回搜索到的其他任何通常看起来的地方
    • 如果没有找到,请到处搜索

    所以,简而言之,我认为命名空间数组可以消除歧义的想法是正确的。我在这方面的第一次测试失败的原因是它只进行了完美匹配,并且我犯了一个错误,即只使用程序集中的根 n/s(换句话说,使用 MyRoot 而不是 MyRoot.Controllers)。

    因此,这个命名空间允许的是在两个不同的命名空间中拥有一个 HomeController,并根据 url 或参数以不同的方式匹配它们。

    【讨论】:

      【解决方案2】:

      不,该值未被弃用。它在 DefaultControllerFactory.cs 中使用。请注意,如果提供了该值,它将完全替换搜索的标准名称空间。当未提供参数时,搜索的名称空间由我们确定:

      HashSet<string> nsDefaults = new HashSet<string>(ControllerBuilder.DefaultNamespaces, StringComparer.OrdinalIgnoreCase);
      

      提供参数时,您提供的列表将替换此值。

      在任何一种情况下,DefaultControllerFactory 都会调用:

      GetControllerTypeWithinNamespaces(controllerName, nsDefaults);
      

      ...带有列表,可以是您提供的列表,也可以是默认列表。所以很明显该值是受支持的。

      当您查看那里的源代码时,以及在 ControllerTypeCache 中,您可以看到命名空间值的真正用途:它不会导致控制器工厂查看原本不会查看的地方;而它是一个过滤器。换句话说,它会阻止默认控制器工厂查找和命名空间,否则它会搜索控制器。

      【讨论】:

      • 我知道它应该是这样工作的,并且我在 DefaultControllerFactory 中找到了您描述的相同位置,但是当我运行上述测试时,它不是这样工作的。我提供了不存在的命名空间,但工厂仍然找到了我的控制器。
      • ControllerTypeCache 中的代码在我看来确实是这样工作的。您可以通过使用源代码构建来调试它。也许有些东西你没有提供?
      • 我同意它看起来是这样的,并且我在之前测试时使用源代码构建;我会用一些不同的参数再试一次。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 2012-09-09
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      相关资源
      最近更新 更多