2010-07-26 92 views
31

我想從我的URL(針對特定控制器)中刪除控制器名稱。例如:ASP.NET MVC - 從URL中刪除控制器名稱

http://mydomain.com/MyController/MyAction

我希望這個網址變更爲:

http://mydomain.com/MyAction

我怎麼會去在MVC這樣做呢?無論如何,我正在使用MVC2。

+0

檢查以下鏈接將有助於 [如何使用MVC中的路徑從URL中刪除控制器名稱](https://stackoverflow.com/questions/34650332/how-to-remove-the-controller-name-from-所述-URL-使用-擊潰功能於MVC/34653793#34653793)。 – 2016-01-07 11:27:10

+0

看到2016年更新在底部 – niico 2016-10-19 16:03:28

回答

40

您應該映射在Global.asax(默認的一個前加入)新的途徑,例如:

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

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

在MVC 4中我必須在RouteConfig.cs中執行此操作。同時刪除默認路由,它不夠之前放行。 – David 2016-04-25 13:47:59

+0

@David,你必須刪除默認路由的原因是你的Home默認索引動作匹配'routes.MapRoute(「Default」,「{controller}/{action}/{id}」,new {controller =「 Home「,action =」Index「,id = UrlParameter.Optional});'也是。它將強制MyController索引操作呈現,而不是您的主控制器索引操作,因爲您的主頁呼叫符合該「路由」。您可以將{action}替換爲方法的實際名稱,而不使用大括號,只有在您調用特定操作時纔會調用它。 – TarasBulba 2016-09-25 03:05:42

+0

請參閱下面的屬性路由答案。 – niico 2016-11-06 20:27:13

0

你必須修改MVC的缺省路由。在ScottGu的博客中有詳細的解釋: http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx

您應該更改的方法是Application_Start。類似以下內容可能會有所幫助:

RouteTable.Routes.Add(new Route(
    Url="MyAction" 
    Defaults = { Controller = "MyController", action = "MyAction" }, 
    RouteHandler = typeof(MvcRouteHandler) 
} 

路由的排序很重要。它會在第一場比賽中停止。因此,默認的應該是最後一個。

-2
routes.MapRoute("SpecificRoute", "MyController/{action}/{id}", 
     new {controller = "MyController", action = "Index", 
     id = UrlParameter.Optional}); 

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

只有當MyController位於URL中時,SpecificRoute纔會匹配,問題的關鍵是從URL中排除控制器。請參閱@ rrejc的答案。 – James 2015-03-12 08:51:09

3

這裏是從HomeController的

用於刪除控制器名稱的步驟

步驟1: 創建路由約束。

public class RootRouteConstraint<T> : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     var rootMethodNames = typeof(T).GetMethods().Select(x => x.Name.ToLower()); 
     return rootMethodNames.Contains(values["action"].ToString().ToLower()); 
    } 
} 

第2步:
添加上述使用我們剛剛創建的路徑約束你的默認映射新的路由映射。通用參數應該是您打算用作「根」控制器的控制器類。現在

routes.MapRoute(
    "Root", 
    "{action}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    new { isMethodInHomeController = new RootRouteConstraint<HomeController>() } 
); 

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

,你應該能夠訪問像這樣你的家控制器方法: example.com/about, example.com/contact

這隻會影響HomeController的。所有其他控制器將具有默認的路由功能。

8

要更新此2016年 - 最好的方法是使用屬性路由。

與RouteConfig.cs這樣做的問題是,舊的路線也將仍然工作 - 所以你必須既

http://example.com/MyController/MyAction

http://example.com/MyAction

擁有多個路由到同一頁面對SEO不利 - 可能導致路徑問題,並在整個應用中創建殭屍網頁和錯誤。

使用屬性路由可以避免這些問題。所有你需要做的就是它添加到RouteConfig.cs(可能是在其他途徑可以匹配前頂部):

routes.MapMvcAttributeRoutes(); 

然後添加路由屬性與路由名稱的每個動作,例如

[Route("MyAction")] 
public ActionResult MyAction() 
{ 
... 
} 
相關問題