2011-12-17 22 views
3

問題があります。 MVC 3には、ページと呼ばれる領域があります。MVCに領域をロードできません - リソースが見つかりません

私はちょうどメディアと呼ばれる新しいエリアを追加しましたが、今ではその新しいエリアに「リソースが見つかりません」というメッセージが表示されます。私はうまくいくPageAreaのように見えるので、私は夢中になります。ここで

ここMediaAreaRegistration.cs

public override string AreaName 
    { 
     get 
     { 
      return "Media"; 
     } 
    } 

    public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      "Media_default", 
      "{controller}/{action}/{id}", 
      new { action = "Index", id = UrlParameter.Optional } 
     ); 
    } 

は私global.asax

​​

です私はローカルホスト/メディア/経由でアクセスしようとしていますが、私はただ、「リソースが見つからない」取得しています。

アイデア?

+0

本当に経路は同じですか? '/ media'というURLは、あなたのメディア領域のデフォルトコントローラまたは' media'というコントローラと一致していますか? – Jan

+0

これは、mediacontrollerというコントローラーと一致する必要があります。ルートは同一ですが、routenameのみが異なります。 –

+0

[OK]を選択します。まったく同じルートを使用することは意味をなさない。最後に登録されたルートは決して一致しない。ルート名はルーティングに全く影響しません。 – Jan

答えて

1

通常、エリアを作成すると、global.asaxとは異なるデフォルトのルートが表示されます。例えば、私はMVC3プロジェクトにおけるメディアの領域を作成し、デフォルトルートは次のようになります。エリアの

context.MapRoute(
    "Media_default", 
    "Media/{controller}/{action}/{id}", 
    new { action = "Index", id = UrlParameter.Optional } 
); 

ルート、彼らは内のコントローラを探していることを除いて、本当にあなたのグローバルasaxで定義されたルートよりも違いはありません別の名前空間。また、global.asaxのルートの前にロードされます。これは、Application_StartでRegisterRoutesの前にRegisterAllAreasが呼び出されたために表示されます。

一般的に、これはあなたのglobal.asaxで定義されたルートとルートコントローラのURLスキーマです:ように

base/ControllerAName/Action1Name 
base/ControllerAName/Action2Name 
base/ControllerBName/Action6Name 

...と。これは、MVCをそのままの状態で取得する「規約」です。よく見て、そしてあなたは、このパターンは、あなたのグローバルasaxにベースルート定義と一致していることがわかります。一方

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", 
     id = UrlParameter.Optional } // Parameter defaults 
); 

、あなたが領域を使用する規則は、あなたの「従来の」URLスキーマは次のようになりますということです:

base/AreaName/ControllerAName/Action1Name 
base/AreaName/ControllerAName/Action2Name 
base/AreaName/ControllerBName/Action6Name 

違いがありますか?これは、エリア登録のデフォルトルート定義が次のようになっている理由です: "Media/{controller}/{action}/{id}"

このすべてが述べているように、 。 Mediaという名前のエリアと、そのエリアの一部のコントローラーのいくつかのアクションメソッドに移動するURLベース/メディアがあるように思えます。それが正しければ、これを試してみてください - MVCによって生成されたデフォルトルートの前に、あなたのより具体的なルートを置くことを思い出し:

context.MapRoute(null, 
    "media", 
    new { action = "Index", controller = "Media" } 
); 

context.MapRoute(
    "Media_default", 
    "Media/{controller}/{action}/{id}", 
    new { action = "Index", id = UrlParameter.Optional } 
); 

これはMVCは自分の中でのMediaControllerにindexアクションメソッドにベース/メディアと一致することを意味しますその経路が最初に定義されているので、メディア領域。

また、新しい領域を作成するときは、は名前空間を変更しません。これにより、問題が発生します。

もう1つのヒントは、経路名を経路に指定しないことです。最初の引数としてnullをどのように渡したかに注目してください。これは良い習慣と考えられています。名前でルートにアクセスすると非常に面倒なことがあります。

新しいプロジェクトを開始したり、新しい領域を作成したり、これらの提案を試してみることをお勧めします。 Webフォームから来るルートを把握するのは難しいかもしれませんが、一度操作すれば、WebフォームのURL-TO-FILEマッピングより優れていると思います。

+0

ありがとう!私はあなたに最初の提案を試みたときにコントローラをロードする権利がありましたが、URLは間違っていました。私はlocalhostでロードするコントローラを得ました。 localhost/mediaを取得しようとしたときリソースが見つかりません。私はあなたに2番目の提案を試しても、/ Mediaの結果はaです。リソースが見つかりません。 –

+0

ありがとう、おそらくglobal.asaxルートマッピングの何かが間違っていますか?私はMVCに慣れていません、私は古いウェブフォームの男です、ごめんなさい:P –

+0

ミック、ルートを正しく取得するのは、ウェブフォームからのトリッキーなことがあります。私もWebフォームからMVCに来た。ルートの順序が重要であることを忘れないでください。私は私の答えを更新します。 – danludwig

7

コントローラの名前空間を確認してください。 私の場合、デフォルトルートは:

context.MapRoute(
      "Admin_default", 
      "Admin/{controller}/{action}/{id}", 
      defaults: new {controller = "Home", action = "Index", AreaName="Admin", id = UrlParameter.Optional }, 
      namespaces: new[] { "MyApp.Admin.Controllers"} 
     ); 

しかし、私はコントローラを作成したとき、MVCは自動的に新しいコントローラの名前空間として「MyApp.WebUI.Areas.Admin.Controllers」を設定します。私は名前空間をデフォルトルートで "MyApp.Admin.Controllers"と定義したものに変更し、アプリケーションは正常に動作します。

+0

それは私の名前空間でした。私はいくつかのコントローラを領域に貼り付けて、それらを変更するのを忘れてしまった。 – biddano

+0

名前空間のヒントは良いものだ。プロジェクトを動かす際に、モデルの名前空間がビューで指定されたものと一致しなくなるように、名前空間の名前を変更しました。 MVCからの警告やヘルプはありません。黙って黙って「リソースが見つかりません」というエラーメッセージが表示されます。素晴らしいチップ、必然的にupvoted。 – markaaronky

0

私の場合、誰かが存在する前にRouteConfig.csにroutes.Clear()を追加しました。しかし、今はエリアを追加しました。これはすべてのルートを消去していました。

関連する問題