2013-08-03 32 views
16

Tôi đang cố gắng để thêm một đường đến một mặc định, vì vậy mà tôi có cả hai url làm việc:ASP.NET MVC 4 Tuyến đường - điều khiển/id vs controller/action/id

  1. http://www.mywebsite.com/users/create
  2. http://www.mywebsite.com/users/1

này sẽ làm cho công việc tuyến đường đầu tiên:

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "users", action = "Index", id = UrlParameter.Optional } 
); 

Tuy nhiên, ro thứ hai ute sẽ không hoạt động rõ ràng.

này sẽ làm cho công việc tuyến đường thứ hai, nhưng sẽ phá vỡ cái đầu tiên:

routes.MapRoute(
    name: "Book", 
    url: "books/{id}", 
    defaults: new { controller = "users", action = "Details" } 
); 

Làm thế nào để kết hợp các cấu hình định tuyến hai để cả hai URL làm việc? Tôi xin lỗi nếu đã có một câu hỏi như thế này trên SO, tôi đã không thể tìm thấy bất cứ điều gì.

+0

URL thứ hai của bạn có chứa "sách" thay vì "người dùng" không? Bạn đề cập rằng tuyến đường thứ hai làm cho url thứ hai hoạt động, nhưng phá vỡ URL thứ nhất, nhưng URL thứ hai không áp dụng cho tuyến đường thứ hai trừ khi nó khớp với mẫu "books/{id}". – Triynko

Trả lời

34

Điều quan trọng là đặt trước các tuyến cụ thể hơn. Vì vậy, đặt tuyến đường "Sách" đầu tiên. Chỉnh sửa Tôi đoán bạn cũng cần một ràng buộc để chỉ cho phép các số khớp với phần "id" của tuyến đường này. End chỉnh sửa

routes.MapRoute(
    name: "Book", 
    url: "books/{id}", 
    defaults: new { controller = "users", action = "Details" }, 
    constraints: new { id = @"\d+" } 
); 

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "users", action = "Index", id = UrlParameter.Optional } 
); 

Và đảm bảo rằng "id" tham số trong "Chi tiết" hành động của bạn là một int:

// "users" controller 
public ActionResult books(int id) 
{ 
    // ... 
} 

Bằng cách này, "Sách" tuyến đường sẽ không bắt một URL như /users/create (do tham số thứ hai được đặt lại thành một số) và do đó sẽ đi qua tuyến đường tiếp theo ("Mặc định").

+0

Vâng, không - nó không rơi như thế này. Khi bạn nhập/người dùng/tạo, máy chủ mong đợi một {id} thay vì "tạo" và cung cấp trang lỗi "Liên kết bị hỏng". –

+0

@ArmanBimatov lỗi của tôi. Tôi bị gỉ. Bạn cũng cần một ràng buộc trong lộ trình, tôi đoán vậy. Tôi đã cập nhật câu trả lời của mình ở trên. http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-route-constraint-cs – McGarnagle

+0

Đẹp, nó hoạt động. Không bao giờ biết về các ràng buộc trong việc xác định định tuyến. –

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