2011-09-07 27 views
17

Hiện nay tất cả mọi thứ dưới HomeController xuất hiện trong URL nhưASP.NET MVC 3 Controller - làm cho mọi thứ dưới điều khiển nhà xuất hiện dưới miền

example.com/Home/{Action} 

Có cách nào chúng ta có thể giữ tất cả các khác định tuyến theo cách đó là nhưng CHỈ trường hợp đặc biệt điều khiển nhà nên tất cả mọi thứ trong nhà đi kèm theo tên miền.

như

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

thay vì tạo lớp điều khiển mới cho mỗi người trong số họ.

EDIT:

URL khác như

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

nào đang trong UserController nên làm việc giống như họ đang

+0

routes.MapRoute ("Mặc định", "{action}", mới {controller = "Home", action = "{action}"}); –

Trả lời

14

Tôi nghĩ rằng cách tốt nhất là:

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

và khi bạn muốn tạo ra một liên kết, sử dụng:

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

OR:

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

thay vì:

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

tính năng này phù hợp với tôi và cũng sẽ phù hợp với bạn.

UPDATE:

bạn có thể tạo một biểu tượng như @ (hoặc - hoặc bất cứ điều gì khác), trước khi action phần trong url, để làm cho url độc đáo, chẳng hạn như:

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

theo cách này, các url của bạn khác với Tuyến đường bản đồ mặc định và bạn có thể tạo các url như:

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

nhưng ý tưởng đầu tiên của tôi là tốt hơn và tôi luôn sử dụng điều đó.

+0

Đây là những gì tôi vừa phát hiện và bắt đầu làm. Và điều này làm việc cho tôi .. ngoại trừ rằng actionlink cũng hoạt động chính xác cho tôi. (nó cung cấp cho các url mong muốn) – MoXplod

+1

Nhưng nếu ai đó có một cách thông minh để chúng tôi không phải lặp lại các dòng mã cho MỌI hành động tôi thêm vào bộ điều khiển nhà mà sẽ là tuyệt vời. Tôi sẽ đánh dấu đây là câu trả lời cho bây giờ, – MoXplod

+4

theo cách khác, (đối với bình luận thứ hai của bạn), là tạo biểu tượng (ví dụ @ hoặc - hoặc bất kỳ thứ gì khác), trước phần hành động, tôi chèn một ví dụ về điều này , trong bản cập nhật của câu trả lời. –

0

Bạn chỉ có thể sửa đổi các tuyến đường mặc định và loại bỏ các bit điều khiển từ url và chỉ định rằng nó sẽ luôn là Home trong các giá trị mặc định:

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

Rõ ràng bạn nhận ra rằng điều này giới hạn ứng dụng của bạn vào một bộ điều khiển duy nhất là HomeController vì hiện tại bạn không còn khả năng đặt ứng dụng trong url của mình nữa. Nhồi tất cả các hành động trong một bộ điều khiển đơn lẻ là một IMHO thực hành tồi và vi phạm một vài nguyên tắc như định tuyến RESTful và SRP.

+0

có, đó là lý do tại sao các câu hỏi .. làm thế nào để trường hợp đặc biệt MỘT bộ điều khiển vì vậy tôi không phải tạo ra một tấn bộ điều khiển. Cảm ơn. – MoXplod

+0

@MoXplod, tôi đã chỉ cho bạn cách trả lời của tôi: bằng cách sửa đổi tuyến mặc định trong global.asax của bạn và xóa '{controller}' bit khỏi url. –

+0

Có, nó trường hợp đặc biệt nhà NHƯNG phá vỡ các tuyến đường cho tất cả các bộ điều khiển khác của tôi. Tôi cần tất cả những người khác làm việc theo cách họ làm ngay bây giờ. – MoXplod

0
+0

giải pháp đó trông đẹp và sạch sẽ, nhưng những gì về hiệu suất, mọi yêu cầu đều trải qua sự phản chiếu để xác định gốc. Nhưng điều này có thể được giải quyết bằng cách bộ nhớ đệm từ điển bộ điều khiển (mà giải pháp không hiển thị) – MoXplod

5

Sử dụng thuộc tính Routing của MVC5, tôi đã làm tương tự như Javad_Amiry câu trả lời, bằng cách đặt một lộ trình cho mỗi hành động trong HomeController:

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

Tôi nghĩ rằng đây là chi tiết duy trì vì đặt tất cả các hành động trong tệp RouteConfig.cs toàn cầu. Vẫn còn tốt hơn để kết hợp Định tuyến Thuộc tính với định tuyến dựa trên quy ước, do đó các hành động mới được thêm vào bộ điều khiển sẽ hoạt động theo mặc định mà không có thuộc tính Route (ví dụ:/Home/action) nhưng có thể được cải thiện bằng cách thêm thuộc tính Route (ví dụ:/action).

+0

Tôi đồng ý, đã thử điều này và nó làm việc tuyệt vời cho tôi. Mặc dù vậy, hãy đảm bảo rằng bạn bật định tuyến thuộc tính trong RouteConfig.cs: 'routes.MapMvcAttributeRoutes();' – Onisemus

Các vấn đề liên quan