2012-04-04 103 views
7

我很喜歡〜/映射到首頁索引,並〜/博客映射到博客索引,但如何防止〜/ Home映射到首頁索引以及?我不希望路由可以從多個端點訪問。ASP.NET MVC 3路由:防止〜/ home訪問?

同樣,我如何防止可以從〜/ Controller和〜/ Controller/Index訪問其他任何「索引」操作?

OK〜/
NO〜/主頁
NO〜/首頁/指數
OK〜/ AnyOtherController
NO〜/ AnyOtherController /索引

我猜的規則應該像防止任何默認動作可以明確地訪問,而在家庭情況下也可以防止只有控制器才能訪問動作。

可以這樣做嗎?過去是否已完成?舉例來說,它不會這樣做(您可以訪問herethere)並且都呈現主頁;並且它們可能與「index」有不同的默認操作名稱,這可能也是可訪問的路由。

+0

這是非常相似的問題我問了一天:http://stackoverflow.com/questions/9974402/301-redirect-original-url-request-to-routed-url。我不是說它是重複的,因爲我認爲它有些不同,但我也有興趣知道這個答案。 – Curt 2012-04-04 16:11:35

+0

我很好奇你爲什麼不希望從多個端點訪問路由。 – 2012-04-04 16:14:29

+0

也許使用nuget中的'AttributeRouting'軟件包,以便您可以明確定義您的所有路線...... – dotjoe 2012-04-04 16:18:47

回答

4

實現像這樣爲了使這些路線是我的MVC應用程序內(爲了使自定義錯誤,可以查看到發生)視爲404錯誤,但仍:

/// <summary> 
    /// By not using .IgnoreRoute I avoid IIS taking over my custom error handling engine. 
    /// </summary> 
    internal static void RegisterRouteIgnores(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "IgnoreHome", 
      "Home", 
      new { controller = "Error", action = "NotFound" } 
     ); 

     routes.MapRoute(
      "IgnoreIndex", 
      "{controllerName}/Index/{*pathInfo}", 
      new { controller = "Error", action = "NotFound" } 
     ); 

這並允許訪問首頁/索引行動通過使用/home/{id},但我願意忍受。

+0

感謝您發佈您最終使用的內容。 – 2012-04-06 17:34:22

4

您可以簡單地聲明不應將路由應用於與那些模式匹配的URL。例如:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.Ignore("Home/{*pathInfo}"); 
    routes.Ignore("{controller}/Index"); 
} 

與這些路由匹配的URL將被視爲裸頁面,這當然不會存在。

+1

他肯定不想忽略** Index **之外的所有其他** Home **操作,所以第一個必須更改爲「Home」。 – 2012-04-04 17:38:03

0

這是我能夠實現我認爲你的要求。

// Portal Sections 
     routes.MapRoute("Home", 
         "", 
         new { controller = "Home", action = "Index" }, 
         new[] { "Myapp.Portal.Controllers" }); 

     routes.MapRoute("About", 
         "about", 
         new { controller = "Home", action = "About" }, 
         new[] { "Myapp.Portal.Controllers" }); 

     routes.MapRoute("Features", 
         "features", 
         new { controller = "Home", action = "Features" }, 
         new[] { "Myapp.Portal.Controllers" }); 


     routes.MapRoute("Help", 
         "help", 
         new { controller = "Help", action = "Index" }, 
         new[] { "Myapp.Portal.Controllers" }); 

     routes.MapRoute("Knowledgebase", 
         "help/kb", 
         new { controller = "Help", action = "Knowledgebase" }, 
         new[] { "Myapp.Portal.Controllers" }); 

我可以訪問

  • mysite.com
  • mysite.com/about
  • mysite.com/features
  • mysite.com/help
  • mysite.com/ help/kb

但訪問是不可

  • mysite.com/home/about
  • mysite.com/home/features

希望這有助於:)