【问题标题】:ASP.NET MVC Routing - all looks to match the correct route template, but not workingASP.NET MVC 路由 - 看起来都匹配正确的路由模板,但不起作用
【发布时间】:2012-10-18 02:43:43
【问题描述】:

我有一个具有“一般”路线结构的网站,以及一个额外的“翻译”区域。所以在顶层,你有类似的东西:

  • /
  • /关于(“通用”)
  • /平移(区域)

在翻译区域内,我有:

  • /Translate/Word(WordController,索引操作)
  • /Translate/Word/Add(WordController,添加操作)
  • /Translate/Word/Improve(WordController,改进操作)

所有这些工作。

但是,只要我在现有结构中添加另一个控制器,例如。定义...

  • /翻译/定义(DefinitionController,索引操作)
  • /翻译/定义/添加(定义控制器,添加操作)

或发音...

  • /翻译/发音(PronunciationController,索引操作)
  • /翻译/发音/添加(PronunciationController,添加操作)

我得到的只是 404。

我所在区域的路由配置如下:

public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Translate_direct",
            "Translate/{controller}/{action}",
            new { action = "Index", controller = "Default", }
        );
        context.MapRoute(
            "Translate_default",
            "Translate/{toLanguageCode}/{query}/{fromLanguageCode}/{controller}/{section}/{action}/{id}",
            new { action = "Index", controller="Default", id = UrlParameter.Optional, section=UrlParameter.Optional }
        );
    }

我已经安装了Phil Haack's RouteDebugger,结果如下:

所以它似乎与控制器和动作匹配,但我只得到一个 404。

为了完整性和保证,还显示了我的“MVC”文件结构:

我显然遗漏了一些明显的东西,但不确定是什么......?


更新:

似乎我的命名空间以某种方式涉及。

我的 TranslateAreaRegistration 类有命名空间 Taggloo.Web.Client.Areas.Translate 但我的 PronunciationController 有一个命名空间 *Taggloo.Web.**Mvc.**Client.Areas.Translate.Controllers *

似乎我的命名空间中的一个错误导致两者不同(TranslateAreRegistration 类也应该在 Taggloo.Web.Mvc.Client.Areas.Translate 命名空间中)是问题。我尝试让它们都 Taggloo.Web.Mvc.... 但这不起作用。我不情愿地将两者都设置为 Taggloo.Web.Client... 而现在它可以工作了。

所以不是一个解决方案,一个变通方法,尽管环顾四周,我仍然不知道为什么。

【问题讨论】:

  • 您好,您想要的只是在所有控制器中拥有相同的命名空间。我的两个控制器分别位于不同的文件夹中,即 Log 和 Error 。一切似乎都对我有用,例如code namespace Web.Controllers { public class LogController : Controller { } } namespace Web.Controllers { public class ErrorController : Controller { } }
  • 啊,谢谢@NipunAmbastha。似乎我错过了我的一个控制器。

标签: asp.net-mvc asp.net-mvc-routing


【解决方案1】:

如果您使用 AreaRegistrationContext.MapRoute 重载之一,则 MVC 中的默认区域注册 ( System.Web.Mcv.AreaRegistration.RegisterAllAreas ) 使用区域的 AreaRegistration 派生类的命名空间将命名空间数据标记添加到路由定义中。

如果已定义此命名空间令牌,则 DefaultControllerFactory 会在匹配路由时交叉检查控制器的命名空间。

如果控制器的命名空间相同(如果命名空间标记以 .* 结尾,则以开头)标记,则工厂将匹配控制器类型并继续实例化控制器。如果不匹配并且ControllerFactory从GetControllerType方法返回null,最终会得到404。

您提到您将两者都设置为 Taggloo.Web.Mvc.... 如果它们相同,它应该可以工作。

【讨论】:

  • 是的,我及时想到了这一点。谢谢。在 MVC 中“幕后”发生了很多事情,我有时想知道 M 是否代表“魔术”。您必须知道约定(过度配置)和背后的原因。
猜你喜欢
  • 2017-02-20
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多