1

問題を説明するためにどのタイトルを使用すればよいのか、本当にわかりません。私の問題を単純化するために。これが私のテストです。mvc3サイトを最初から作成します。次に、「admin」という領域を追加します。admin内には、「Search」という名前のコントローラーがあり、「Authorize」属性が装飾されています。次に、Global.ascx.csルート設定を変更して、コントローラーの名前空間を追加しました。今、私は私のテストを開始します。

質問1

http:// localhost:xxx / Searchページにアクセスすると、/ Account / Logonページにリダイレクトされます。最初に混乱しますが、なぜログオンページにリダイレクトされるのですか?私が理解しているように、管理者検索コントローラーにはまったく届かないはずです。Authorize属性を削除すると、期待どおりにビューが見つからないという黄色の画面が表示されます。

質問2

(Roles = "Admin")などの役割でAuthorize属性を追加すると、ログインが成功したかどうかに関係なく、検索ページへのアクセスを再試行します。常にログオンページにリダイレクトされます。黄色の画面が表示されないのはなぜですか。管理エリアではなく、メインサイトの検索コントローラーのインデックスビューをリクエストしようとしています。かなり混乱します。

私はMVC開発の初心者ですが、誰かが私の問題に関する解決策を教えてくれますか?

ありがとう

Global.ascx.cs

        public static void RegisterRoutes(RouteCollection routes) {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },                      
            new string[]{"TestAreaRouting.Controllers"}
          );

        }
4

1 に答える 1

1

データトークンを次のように設定するRegisterRoutesことで、デフォルトのコントローラーファクトリを制約して、コントローラーの指定された名前空間内のみを検索するようにすることができます。Global.asaxUseNamespaceFallbackfalse

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        new string[] { "TestAreaRouting.Controllers" }
    ).DataTokens["UseNamespaceFallback"] = false;
}

これを行わない場合、URLがプレフィックスで始まらないため、エリアルートが一致しません/searchadminAdmin

したがって、これが一致するデフォルトルートです。SearchControllerデフォルトのコントローラーファクトリは、から派生したと呼ばれるクラスのアセンブリのスキャンを開始し、クラスControllerが見つかったため、それをインスタンス化し、それを使用して要求を処理します。明らかに存在しないように見えるため、対応するインデックスビューが見つからないことは~/Views/Search/Index.cshtml明らかです。実際のビューはそのエリアにあります。

コントローラをそれぞれの場所に制約したので、Authorize属性でコントローラを装飾することができ、一貫して動作するはずです。

于 2011-12-06T13:07:57.350 に答える