2010-07-26 41 views
31

Tôi muốn xóa tên bộ điều khiển khỏi URL của tôi (đối với một bộ điều khiển cụ thể). Ví dụ:ASP.NET MVC - Xóa tên bộ điều khiển khỏi URL

http://mydomain.com/MyController/MyAction

tôi muốn URL này phải được thay đổi để:

http://mydomain.com/MyAction

thế nào tôi sẽ đi về việc này trong MVC? Tôi đang sử dụng MVC2 nếu điều đó giúp tôi trong anyway.

+0

Kiểm tra liên kết sau sẽ giúp [Cách xóa tên bộ điều khiển khỏi url bằng cách sử dụng rout trong MVC] (https://stackoverflow.com/questions/34650332/how-to-remove-the-controller-name-from- the-url-using-rout-in-mvc/34653793 # 34653793). –

+0

XEM CẬP NHẬT 2016 TẠI BOTTOM – niico

Trả lời

40

Bạn nên lập bản đồ tuyến đường mới trong global.asax (thêm nó trước khi một mặc định), ví dụ:

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

Trong MVC 4 tôi phải làm điều này trong RouteConfig.cs. Cũng loại bỏ các tuyến đường mặc định, nó không đủ để đặt dòng trước. – David

+0

@David, lý do bạn phải xóa tuyến mặc định là vì hành động chỉ mục mặc định của Trang chủ của bạn khớp với 'routes.MapRoute (" Mặc định "," {controller}/{action}/{id} ", new {controller =" Trang chủ ", action =" Index ", id = UrlParameter.Optional});' là tốt. Nó sẽ buộc các hành động MyController Index để render thay vì điều khiển nhà của bạn Index hành động vì cuộc gọi trang chủ của bạn đủ điều kiện cho rằng "Route". Bạn có thể thay thế {action} bằng tên thực tế của phương thức mà không cần dấu ngoặc nhọn và nó sẽ CHỈ gọi nó khi bạn thực hiện cuộc gọi đến hành động cụ thể đó. – TarasBulba

+0

Xem câu trả lời Định tuyến Thuộc tính bên dưới. – niico

0

Bạn sẽ phải sửa đổi các tuyến đường mặc định cho MVC. Có một lời giải thích chi tiết tại blog của ScottGu: http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx

Phương pháp bạn nên thay đổi là Application_Start. Một cái gì đó như sau có thể giúp:

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

Thứ tự của các tuyến là đáng kể. Nó sẽ dừng lại trong trận đấu đầu tiên. Vì vậy, một mặc định nên là người cuối cùng.

-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

'SpecificRoute' sẽ chỉ khớp nếu' MyController' nằm trong URL, điểm của câu hỏi là * loại trừ * bộ điều khiển khỏi URL. Xem câu trả lời của @ rrejc. – James

3

Dưới đây là các bước để tên điều khiển remove từ HomeController

Bước 1: Tạo các hạn chế đường.

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()); 
    } 
} 

Bước 2:
Thêm một ánh xạ tuyến đường mới trên bản đồ mặc định của bạn có sử dụng các hạn chế con đường mà chúng ta vừa tạo ra. Tham số chung phải là lớp điều khiển bạn định sử dụng làm bộ điều khiển "Gốc" của bạn.

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 } 
); 

Bây giờ bạn sẽ có thể truy cập vào các phương pháp điều khiển ngôi nhà của bạn như sau: example.com/about, example.com/contact

Điều này sẽ chỉ ảnh hưởng đến HomeController. Tất cả các bộ điều khiển khác sẽ có chức năng định tuyến mặc định.

8

Để cập nhật điều này cho năm 2016 - cách tốt nhất để làm điều này là sử dụng Định tuyến thuộc tính.

Vấn đề với việc này trong RouteConfig.cs là các tuyến đường cũ cũng vẫn sẽ làm việc - vì vậy bạn sẽ có cả

http://example.com/MyController/MyAction

http://example.com/MyAction

Có nhiều các tuyến đường đến cùng một trang không tốt cho SEO - có thể gây ra các vấn đề về đường dẫn và tạo các trang và lỗi zombie trong toàn bộ ứng dụng của bạn.

Với định tuyến thuộc tính, bạn tránh những sự cố này. Tất cả bạn phải làm là thêm video này vào RouteConfig.cs (có lẽ ở phía trên trước khi các tuyến đường khác có thể phù hợp):

routes.MapMvcAttributeRoutes(); 

Sau đó, thêm Route thuộc tính cho mỗi hành động với tên tuyến đường, ví dụ

[Route("MyAction")] 
public ActionResult MyAction() 
{ 
... 
} 
Các vấn đề liên quan