11

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

したがって、「Some」と呼ばれる領域に「Thing」と呼ばれる単純なコントローラーがあり、次のことを行うとします...

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

アクションは正しく実行されますが、MVC がビューを見つけられず、次のようなメッセージが表示されます。

ビュー「インデックス」またはそのマスターが見つかりませんでした...そして、検索されたすべての場所が表示されます。

~/Views/Thing/Index.cshtml ~/Views/Shared/Index.cshtml

などなど、しかし、それは見えません

〜/一部/ビュー/もの/Index.cshtml

私が間違っていることについてのアイデアはありますか?

4

9 に答える 9

17

わかりました、私自身の質問に答えなければならないのは残念ですが、私が探していた答えを誰も教えてくれませんでした. 私の問題はカスタムルーティングにあったようです。

問題を再現するために、空の MVC 3 プロジェクトを作成し、「Some」と呼ばれる領域と、その領域に「Thing」と呼ばれるコントローラーを追加しました。その上で、単純にビューを返す Index アクションを作成しました。次に、Index ビューを ~/Areas/Some/Views/Thing/Index.cshtml に追加しました。

偉大な。/Some/Thing/Index を押すと、ビューが正しく返されます。

次に、次のような Global.asax へのルートを追加します。

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

/Bob に移動すると、前述のエラーが表示されます - MVC がビューを見つけられません。この問題を解決するには、このルートを Global.asax ではなく SomeAreaRegistration クラスに登録する必要がありました。「area」プロパティも必要なかったので、このようになります。

    context.MapRoute(
        "Custom", // Route name
        "Bob", // URL with parameters
        new { controller = "Thing", action = "Index" }
        );
于 2011-07-21T10:15:37.143 に答える
4

コントローラーの名前が area と同じ場合、コントローラーは area ルートをチェックする前にデフォルトのベース ルートによって取得される{controller}/{action}ため、エリア /views ではなくルート /views でビューを探します。エリアまたはコントローラーの名前を変更すると、これが解決されます。

于 2012-11-14T02:10:48.127 に答える
1

エリアを使用する場合は、index.cshtml を ~/Areas/Some/Views/Thing/Index.cshtml に配置します。

于 2011-07-20T22:54:52.667 に答える
1

global.asax に次のルートを追加してみてください。

 context.MapRoute(
                "default",
                "Some/{controller}/{action}/",
                new { controller = "Thing", action = "Index"}
            );
于 2011-07-20T13:59:28.193 に答える
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 }
        );
    }
}
于 2011-07-20T14:18:33.610 に答える
0

ここに別のソリューションを追加するだけです。私もこの問題を抱えていましたが、Global.asax.cs で競合する「キャッチオール」ルートが原因でした。

このルートを削除すると、問題が修正されました。

于 2012-03-27T09:40:29.190 に答える
0

コントローラーメソッドが呼び出されているかどうかを(ブレークポイントを設定して)確認しましたか?

ビューが検索される場所にリストしたページは、「一部」の領域にはありません。どこからリンクを呼び出しますか?

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

 @Html.ActionLink("Go To Some/Thing", "Index", "Thing", new {area="Some"}, null)
于 2011-07-21T07:21:33.070 に答える
-1

* ~Some/ *Views..... デフォルトでは (どのようにそれを強制できるかわかりません)、規則は ~/Views/...... になるので、'ビューを配置する適切な場所になります。URL に「Some」を含めたい場合は、それを処理するようにルーティングを変更できます。

于 2011-07-20T13:59:37.117 に答える