2011-12-06 13 views
1

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

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

質問2

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

私は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"} 
     ); 

     } 

答えて

1

あなたがにUseNamespaceFallbackデータトークンを設定することにより、Global.asaxRegisterRoutes方法のコントローラに対してのみ指定された名前空間の内側に見えるように、デフォルトのコントローラの工場を制約する可能性がfalse

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; 
} 

これを行わないと/searchを要求すると、URLがAdminという接頭辞で始まらないため、adminエリアルートが一致しません。

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

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

+0

あなたの説明に感謝します。しかし、私はまだそれを混同します。まず、authorize属性を削除すると、管理領域内の検索コントローラをスキャンしない理由を説明できますか? – Vincent

+0

@Vincent、あなたのために推奨されるコードはありませんか?特に混乱しているのは何ですか? –

+0

ところでダリン、チャンスがあれば私の別の質問を説明することもできますhttp://stackoverflow.com/questions/8219347/asp-net-mvc-allowhtml-bug-or-something-i-didnt-use-正しく – Vincent