2016-06-07 89 views
1

我剛剛開始了一個新的MVC項目,默認路由似乎沒有像我期望的那樣工作。MVC默認路由不能用於控制器

路由配置:

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

    routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 
} 

我有一個ActionLink去「索引」動作「腳本」控制器,帶有@Html.ActionLink("Scripts", "Index", "Scripts")

public class ScriptsController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new IndexModel(); 
     ....... 
     return View(model); 
    } 
} 

當點擊該鏈接時,瀏覽器嘗試導航到「http://localhost:1733/Scripts/」,瀏覽器顯示「目錄列表拒絕」錯誤。當我手動將URL更改爲「http://localhost:1733/Scripts/Index」時,它工作正常。

不應該默認路由自動推斷「索引」行動? 它似乎是工作的ManageController類,這是默認的MVC網站模板的一部分(「http://localhost:1733/Manage」帶來了Index的ActionResult的ManageController

我在做什麼錯?

回答

6

我想你的應用程序根目錄中有物理「腳本」。您看到的錯誤消息是預期的行爲。當/Scripts的GET請求到來時,IIS不知道是返回(腳本的)目錄內容還是讓mvc返回ScriptsController結果。這很混亂。

您應該儘量不要將您的控制器命名爲與物理目錄名相同的名稱。更改任一名稱。

如果您不想重命名其中的任何一個,則可以將RouteExistingFiles屬性設置爲true,以告知框架路由是否應處理與現有物理文件/目錄匹配的URL。

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

     routes.MapRoute("Default", "{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 

     routes.RouteExistingFiles = true; 
    } 
} 

你需要確保你沒有在ScriptsController相匹配的物理文件/靜態資源的任何動作方法(例如:捆綁/最小化腳本資源名稱)。

+1

項目根目錄中有一個「Scripts」目錄,它是用於存放JavaScript文件的默認MVC模板的一部分。這個應用程序將處理管理SQL腳本,所以只有一個巧合的名稱衝突。將控制器名稱更改爲'ScriptController'確實解決了這個問題。謝謝。 –