我想從我的URL(針對特定控制器)中刪除控制器名稱。例如:ASP.NET MVC - 從URL中刪除控制器名稱
http://mydomain.com/MyController/MyAction
我希望這個網址變更爲:
http://mydomain.com/MyAction
我怎麼會去在MVC這樣做呢?無論如何,我正在使用MVC2。
我想從我的URL(針對特定控制器)中刪除控制器名稱。例如:ASP.NET MVC - 從URL中刪除控制器名稱
http://mydomain.com/MyController/MyAction
我希望這個網址變更爲:
http://mydomain.com/MyAction
我怎麼會去在MVC這樣做呢?無論如何,我正在使用MVC2。
您應該映射在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});
在MVC 4中我必須在RouteConfig.cs中執行此操作。同時刪除默認路由,它不夠之前放行。 – David 2016-04-25 13:47:59
@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
請參閱下面的屬性路由答案。 – niico 2016-11-06 20:27:13
你必須修改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)
}
路由的排序很重要。它會在第一場比賽中停止。因此,默認的應該是最後一個。
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});
只有當MyController位於URL中時,SpecificRoute纔會匹配,問題的關鍵是從URL中排除控制器。請參閱@ rrejc的答案。 – James 2015-03-12 08:51:09
這裏是從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的。所有其他控制器將具有默認的路由功能。
要更新此2016年 - 最好的方法是使用屬性路由。
與RouteConfig.cs這樣做的問題是,舊的路線也將仍然工作 - 所以你必須既
http://example.com/MyController/MyAction
和
擁有多個路由到同一頁面對SEO不利 - 可能導致路徑問題,並在整個應用中創建殭屍網頁和錯誤。
使用屬性路由可以避免這些問題。所有你需要做的就是它添加到RouteConfig.cs(可能是在其他途徑可以匹配前頂部):
routes.MapMvcAttributeRoutes();
然後添加路由屬性與路由名稱的每個動作,例如
[Route("MyAction")]
public ActionResult MyAction()
{
...
}
檢查以下鏈接將有助於 [如何使用MVC中的路徑從URL中刪除控制器名稱](https://stackoverflow.com/questions/34650332/how-to-remove-the-controller-name-from-所述-URL-使用-擊潰功能於MVC/34653793#34653793)。 – 2016-01-07 11:27:10
看到2016年更新在底部 – niico 2016-10-19 16:03:28