2011-12-06 55 views
1

我真的不知道應該用什麼標題來描述我的問題。爲了簡化我的問題。這是我的測試。我從頭開始創建一個mvc3網站。然後我添加名爲「admin」的區域。在管理員內部,我有一個名爲「搜索」的控制器,並具有裝飾的「授權」屬性。然後我改變了我的Global.ascx.cs路由設置,以追加我的控制器命名空間。現在我開始我的測試。MVC3區域+授權屬性+角色奇怪問題

問題1

當我訪問到http://localhost:xxx/Search頁,它重定向我回/帳號/登錄頁面,這讓我第一次迷惑,爲什麼它重定向我到登錄頁面?根據我的理解,它根本不應該到達管理員搜索控制器。如果我刪除了授權屬性,它會顯示黃色屏幕,說我找不到預期的視圖。

問題2

如果我添加授權與角色,例如屬性(角色=「管理」),然後我再次嘗試訪問搜索頁面,無論登錄成功與否,我總是會重定向回登錄頁面。爲什麼它不給我黃色的屏幕,因爲我試圖請求主站點中的搜索控制器索引視圖而不是管理區域的視圖。相當混亂。

我是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時,admin區域路由不匹配,因爲該網址不以Admin前綴開頭。

所以它是匹配的默認路由。默認控制器工廠開始掃描程序集中的名爲SearchController的類,該類從Controller派生,並且因爲它找到一個它實例化它並使用它來爲請求提供服務。顯然它沒有找到相應的索引視圖,因爲它看起來在~/Views/Search/Index.cshtml中顯然不存在。實際視圖位於該區域。

現在我們已經將控制器限制到各自的位置,您可以使用Authorize屬性修飾它們,並且它應該保持一致。

+0

嗨達林謝謝你的解釋。但我仍然混淆了這一點。首先可以解釋爲什麼當我刪除授權屬性時,它不會掃描管理區域內的搜索控制器? – Vincent

+0

@Vincent,建議的代碼不適合你嗎?你特別困惑的是什麼? –

+0

順便提一句,達林,如果你有機會,你還可以幫助解釋我的另一個問題http://stackoverflow.com/questions/8219347/asp-net-mvc-allowhtml-bug-or-something-i-didnt-use-正確地 – Vincent