5

「一般的な」ルート構造と追加の「翻訳」エリアを備えたサイトがあります。したがって、トップレベルでは、次のようなものがあります。

  • /
  • / About( "generic")
  • /翻訳(エリア)

翻訳エリア内には、次のものがあります。

  • / Translate / Word(WordController、インデックスアクション)
  • / Translate / Word / Add(WordController、アクションの追加)
  • / Translate / Word / Improve(WordController、Improveアクション)

これらすべてが機能します。

ただし、既存の構造にさらにコントローラーを追加するとすぐに、たとえば。意味 ...

  • / Translate / Definition(DefinitionController、インデックスアクション)
  • / Translate / Definition / Add(DefinitionController、アクションの追加)

または発音..。

  • / Translate / Pronunciation(PronunciationController、インデックスアクション)
  • / Translate / 発音/追加(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*でした。

2つが異なる原因となった名前空間のエラー(TranslateAreRegistrationクラスもTaggloo.Web.Mvc.Client.Areas.Translate名前空間にある必要があります)が問題のようです。両方をTaggloo.Web.Mvc....にしてみましたが、うまくいきませんでした。惜しみなく両方をTaggloo.Web.Client...に設定しましたが、現在は機能しています。

したがって、解決策や回避策ではありません。これを検討しているにもかかわらず、私はまだ理由について賢明ではありません。

4

1 に答える 1

1

MVC の既定のエリア登録 ( System.Web.Mcv.AreaRegistration.RegisterAllAreas ) では、AreaRegistrationContext.MapRoute オーバーロードの 1 つを使用する場合、Area の AreaRegistration 派生クラスの名前空間を使用して Namespace データ トークンをルート定義に追加します。

次に、この Namespaces トークンが定義されている場合、DefaultControllerFactory はルートを照合するときにコントローラーの名前空間をクロス チェックします。

コントローラーの名前空間が同じ (または名前空間トークンが .* で終わる場合は で始まる) トークンの場合、ファクトリはコントローラーの型と一致し、コントローラーのインスタンス化に進みます。一致せず、ControllerFactory が GetControllerType メソッドから null を返すと、最終的に 404 が返されます。

両方を Taggloo.Web.Mvc... に設定したとのことでした。それらが同一であれば、機能していたはずです。

于 2012-11-16T03:13:50.347 に答える