2011-07-20 16 views
10

MVC 3で複数の領域を使用していますが、私のビューが見つからないという問題があります。ルーティングはコントローラを正しくピックアップしているようです(すべてのアクションは問題なく実行されています)。しかし、ビューMVCを返すと、単にそれを見つけられません。MVC 3は領域のビューを検索しません

だから私は「一部」と呼ばれるエリアに「シング」と呼ばれるシンプルなコントローラを持っていると私は

public ActionResult Index() 
{ 
    return View("Index"); 
} 

アクションが正しく実行される...次の操作を行いますが、場合MVCは見つけられません。ビューは、私は

ビュー「インデックス」またはそれはマスターのようなものが見つかりませんでしたというメッセージを得るでしょう...そして、それは私になりますすべての検索場所を、表示されます

〜/ビュー/ Thing/Index.cshtml 〜/ Views/Shared/Index.cshtml

など、など、それは私が間違っているのかに

〜/一部/ビュー/シング/ Index.cshtml

任意のアイデアに見ていないのですか?

+0

エリア登録ファイルは正しい場所にありますか? –

+0

viewnameなしで試しましたか?標準では、actionmethodの名前がviewnameとして使用されます。 戻り値View(); – Tobias

答えて

17

、[OK]を自分の質問に答えるために持って申し訳ありませんが、誰も本当に私に答えを与えました私は探していた。私の問題はカスタムルーティングの問題でした。

問題を再現するために、空のMVC 3プロジェクトを作成し、その領域に「Some」という名前の領域と「Thing」というコントローラを追加しました。私は、単にビューを返したインデックスアクションを作成しました。その後、〜/ Areas/Some/Views/Thing/Index.cshtmlにインデックスビューを追加しました

素晴らしいです。ですから、私が/ Some/Thing/Indexをヒットすると、ビューが正しく返されます。

グローバルにルートを追加してください。

routes.MapRoute(
       "Custom", // Route name 
       "Bob", // URL with parameters 
       new { area = "Some", controller = "Thing", action = "Index" } 
       ); 

私が/ Bobに移動すると、私が言及したエラーが発生します。MVCはビューを見つけません。この問題を解決するには、Global.asaxの代わりにSomeAreaRegistrationクラスにこのルートを登録する必要がありました。私はまた、 'エリア'プロパティを必要としなかったので、このように見えます。

context.MapRoute(
     "Custom", // Route name 
     "Bob", // URL with parameters 
     new { controller = "Thing", action = "Index" } 
     ); 
+4

私はルート登録を一元化しようとしたのと同じ問題がありました。私もAreaRegistrationContextではなくRouteCollectionでMapRouteを呼び出していたことが判明しました。 – stephen

1

Global.asaxの中で、次のルートを追加してみてください。

context.MapRoute(
       "default", 
       "Some/{controller}/{action}/", 
       new { controller = "Thing", action = "Index"} 
      ); 
+0

私はMVCルーティングについて十分に分かりません。ありがとう –

+0

あなたは歓迎です:) –

-1

それはで見ていないよ* 〜デフォルトでは(私はあなたが強制することができますかわからない.....いくつか/ *ビューそのどちらか)、コンベンションは〜/ Views/......となるので、ビューを置くのに適しています。URLに "Some"が含まれるようにするには、ルーティングを変更することができますそれを処理する。

+1

それは正しいことはできません...それは '新しい領域を追加'を選択すると、領域に 'ビュー'フォルダを作成しますか? –

+0

@ AD.Net - あなたが言ったことは、MVCエリアが関わっているときは正しくありません。 〜/ Areas/Support/Views/Home/*のビューがあり、エリアが正しく登録されていれば、その場所からビューが使用されている限りです。 –

1

"Some"領域にSomeAreaRegistration.csというファイルがあることを確認してください。 このファイルは、次のようなものが含まれている必要があります

public class SomeAreaRegistration : AreaRegistration 
{ 
    public override string AreaName 
    { 
     get 
     { 
      return "Some"; 
     } 
    } 

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

私は実際にそれを持っています... –

+0

インデックスビューではなく別のアクションを表示するには、** RedirectToAction( "MyAction")**メソッドを使用する必要があります。インデックスに戻る場合は、** return View(); **のみを使用してください。 –

1

領域を使用する場合は、場所〜/エリア/いくつか/ビュー/シング/ Index.cshtml

0

であなたのindex.cshtmlを入れて、あなたがで(確認しましたブレークポイントを設定する)コントローラメソッドが呼び出された場合?

ビューが検索されたページは、「一部」にありません。 どこからリンクを呼び出していますか?

あなたがアクションリンクにエリアを設定する必要があり、別の領域からか、ルートからリンクを呼び出す場合:

@Html.ActionLink("Go To Some/Thing", "Index", "Thing", new {area="Some"}, null) 
+0

そうですね、コントローラーに間違いなく当たっています –

0

もう1つの解決方法を追加してください。私もこの問題を抱えていましたが、私はGlobal.asax.csの "catch all"ルートを持つことに起因していました。

このルートを削除すると問題が解決しました。あなたのコントローラがエリアと同じ名前を持つ場合

4

は、あなたのコントローラは、それが地域のルートをチェックする前に、デフォルトのベースルート{controller}/{action}によってピックアップされるので、ルート/ビューではなく、内のビューを探しますエリア/ビュー。エリアまたはコントローラの名前を変更すると、これが解決されます。

+0

AreaRegistrationのルートを変更すると、コントローラの名前も含めて、コントローラの名前を変更せずに問題を解決します。 –

関連する問題