5

我有一个具有“一般”路线结构的站点和一个附加的“翻译”区域。所以在顶层,你有类似的东西:

  • /
  • /关于(“通用”)
  • /翻译(区域)

在翻译区域内,我有:

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

所有这些工作。

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

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

或发音...

  • /翻译/发音(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 的 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...而现在它可以工作了。

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

4

1 回答 1

1

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

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

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

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

于 2012-11-16T03:13:50.347 回答