2011-09-02 112 views
1

我已經在Visual Web Developer 2010 Express中創建了一個新的ASP.NET MVC 3互聯網應用程序,並且我注意到使用此默認模板,路徑localhost:port/Home顯示與localhost:port/相同的內容ASP.NET MVC 3刪除/主頁

有沒有辦法刪除/Home?我只希望localhost:port/成爲着陸頁。

回答

3

兩個URL的工作,因爲這是怎樣的默認路由已在Global.asax中定義:

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

這意味着所有的//Home/Home/Index將土地交給HomeController/Index行動。因此,實際上,當您要求/時,它執行的操作完全相同。該做的唯一的控制器和動作,你將永遠能夠在應用程序運行將是HomeController中和索引操作

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

當然:

您可以修改它,如下所示。沒有其他操作或控制器將永遠不可訪問,因爲您不提供任何方法來指定它們。所以我會保留默認路由,因爲它們允許處理99%的情況,除非你有一些特定的要求。

+0

我在想同樣的事情('{id}'作爲路線)。但是我認爲你仍然可以註冊其他路由(例如'{controller}/{action}/{id}'),並且只有你的家庭控制器永遠不會顯示在URL中以便進行操作。 'Url.Action(「Index」,「Home」,{id = 1})'會返回/ 1,而Url.Action(「About」,「Home」)'仍然會返回/ Home/About。 –

+0

@Major Byte,我僅以一個示例的形式提供了關於路由的一些解釋,而不是應該使用的內容。 –

3

其他人是正確的。但是他們並沒有真正告訴你一個方法。讓路由的更好控制的一種方法是如下

在註冊路線方法

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     var controllers = typeof(MvcApplication).Assembly.GetTypes().Where(t => !t.IsAbstract && t.Navigate(_ => _.BaseType).Any(_ => _ == typeof(Controller))); 
     foreach (var controller in controllers) 
     { 
      var actions = controller.GetMethods().Where(m => m.HasAttribute<RouteAttribute>()).Select(m => new { Method = m, Attribute = m.GetAttribute<RouteAttribute>() }).ToArray(); 
      foreach (var action in actions.OrderBy(m => m.Attribute.Path.Count(c => c == '{'))) 
       routes.MapRoute(string.Format("{0}.{1}", controller.Name, action.Method.Name), action.Attribute.Path.TrimStart('/'), new { controller = controller.Name.Replace("Controller", ""), action = action.Method.Name }); 
     } 

,然後裝飾與路由屬性,它定義完全相同的路線應該是你的控制器方法做類似下面。你必須自己創建路由屬性,它只是一個具有字符串參數的屬性,非常簡單。通過這種方式,您可以設置任何控制器方法以擁有您喜歡的任何路線。

+0

+1用於保存400頁文檔的路由註冊。 –