2011-09-07 98 views
17

目前在HomeController的一切都出現在URL作爲ASP.NET MVC 3控制器的路線 - 讓

example.com/Home/{Action} 

域下下家控制器一切似乎有,我們可以將所有其他路由事情是這樣的一種方式但只有特殊情況下的家庭控制器,所以家中的所有東西都在域名下。

example.com/about 
example.com/contact 
example.com/error 

,而不是爲他們每個人創造新的控制器類。

編輯:

其他網址的喜歡

example.com/user/details/123 
example.com/user/edit/123 

這是在UserController中應該工作一樣,他們現在

+0

routes.MapRoute(「Default」,「{action}」,new {controller =「Home」,action =「{action}」}); –

回答

14

我認爲最好的方法是:

routes.MapRoute("home", "home", new { controller = "Home", action = "Index" }); 
routes.MapRoute("about", "about", new { controller = "Home", action = "About" }); 
routes.MapRoute("contact", "contact", new { controller = "Home", action = "Contact" }); 

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
); 

,當你想創建一個鏈接,使用:

@Html.RouteLink("Home", "home", new{/* route values */}, new {/* html attribues */}) 

OR:

@Html.RouteLink("Home", "home") 

代替:

@Html.ActionLink("Home", "Index", "Home", new{/* route values */}, new {/* html attribues */}) 

這適用於我,也應該爲你工作。

UPDATE:

,你可以創建一個像@(或-或其他任何東西)的象徵,在URL中的action部分之前,以唯一網址,如:

routes.MapRoute(
    "test", // route name 
    "@{action}", // url and parameters 
    new {controller = "MyHome", action = "Home"} // parameter defaults 
    ); 
routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
    ); 

這樣,您的網址與默認地圖路線不同,您可以創建類似以下網址:

site.com/@Home 
site.com/@About 
site.com/@Contact 

但在我的想法中,第一個更好,我總是使用它。

+0

這就是我剛剛發現並開始做的事情。這對我來說是有效的,除了actionlink也適用於我。 (它給出了所需的網址) – MoXplod

+1

但是,如果有人有另一種聰明的方式,所以我們不必重複這些代碼行來添加到家庭控制器中的每一個動作都很棒。我將此標記爲現在的答案, – MoXplod

+4

另一種方式(對於您的第二個評論)是在動作部分之前創建符號(例如@或 - 或其他任何內容),以便插入此示例,在答案的更新。 –

0

你可以簡單地修改默認路由並卸下控制器位從url中指定它將始終爲Home的默認值:

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

顯然你意識到這會限制你的應用程序到一個單一的控制器,這是HomeController,因爲現在你不再有任何可能將它設置在你的url中。在單個控制器中填充所有操作是恕我直言的慣例,違反了RESTful路由和SRP等一些原則。

+0

是的,這就是爲什麼問題..如何特殊情況下的一個控制器,所以我沒有創建一噸控制器。謝謝。 – MoXplod

+0

@MoXplod,我向您展示瞭如何在我的答案中:通過修改您的global.asax中的默認路由並從url中移除「{controller}」位。 –

+0

是的,它的特殊情況家庭但打破了我的所有其他控制器的路線。我需要所有其他人按照他們現在所做的方式工作。 – MoXplod

5

使用MVC5的屬性路由,我做了類似Javad_Amiry答案,通過將路由在HomeController中每個動作:

public class HomeController : Controller 
{ 
    [Route("about")] 
    public ActionResult About() 
    { 
     return View(); 
    } 

我想這是不是把每一個動作更容易維護在全局RouteConfig.cs文件中。更好的做法是將屬性路由與基於約定的路由結合起來,因此添加到控制器的新行爲默認在沒有路由屬性的情況下工作(例如:/ Home/action),但可以通過添加路由屬性(例如:/ action)來改進。

+0

我同意,試過這個,它對我很好。趕上:確保你啓用RouteConfig.cs中的屬性路由:'routes.MapMvcAttributeRoutes();' – Onisemus