2011-10-21 15 views
5

Tôi nghĩ rằng tôi đã hỏi điều này nhưng giải pháp không thực sự có ý nghĩa. Dù sao, tôi có ActionLinks trên quan điểm của tôi như thế này:mvc tuyến đường url hành động sử dụng tên thay vì id

foreach(var item in Model){ 
<%: Html.ActionLink(item.Name, "Details", new {id = item.Id}) %> 
} 

bây giờ, khi nó đi vào chi tiết hành động của tôi rõ ràng đây sẽ là url

/MyThings/Details/{id} 

Tôi đã tự hỏi nếu nó có thể hiển thị các tên của mục đó thay vì id Sử dụng slug? hoặc sửa đổi asax toàn cầu như vậy:

/MyThings/Details/CarKeys 

Điều cần đặt tên là duy nhất, có cách nào tôi có thể sửa đổi tên chung trên toàn cầu để hiển thị tên thay cho id không?

Bất kỳ lời khuyên nào được đánh giá cao!

Trả lời

6

Chắc chắn, bạn chỉ cần thay đổi quy tắc định tuyến của mình. Nhìn vào tập tin Global.asax.cs của bạn, hoặc trong hồ sơ đăng ký khu vực của bạn, cho một cái gì đó như thế này:

routes.MapRoute(..., "{controller}/{action}/{id}", ...); 

... và thay đổi nó thành một cái gì đó như thế này:

routes.MapRoute(..., "{controller}/{action}/{name}", ...); 

Sau đó có bạn hành động lấy tên thay vì ID:

Html.ActionLink(item.Name, "Details", new {item.Name}) 
+0

có, nhưng điều này sẽ cần phải thay đổi các truy vấn mà nó đạt được với bộ điều khiển chính xác không? từ ActionResult Details công cộng (int id) đến Public ActionResult Deatils (tên chuỗi). Tôi đã cố gắng để tránh điều đó, nhưng nếu không có bất kỳ lựa chọn thì tôi gues đó là con đường để đi? – gdubs

+0

Tùy thuộc. Tham số '{id}' của bộ điều khiển của bạn có đang chờ tên không? nếu vậy thì chỉ cần 'new {id = item.Name}' – Buildstarted

+0

@gdubs: Vâng, nếu bạn định xác định nội dung theo tên của nó, rõ ràng bạn sẽ cần phải sử dụng truy vấn khác nếu bạn đang xác định nó bằng cách ID của nó. Có một số thủ thuật ràng buộc nâng cao mà bạn có thể sử dụng để giải quyết vấn đề này, nhưng tôi muốn nói bạn nên giữ nó đơn giản. Nếu bạn muốn sự tiện lợi của ID, nhưng cũng muốn bao gồm tên để làm cho nó trông đẹp, chỉ cần bao gồm cả hai giống như Malevolence chỉ ra. – StriplingWarrior

8

Nếu điều này chỉ dành cho mục đích SEO, chỉ cần bao gồm cả ID và Tên. Tên sẽ là một phần của URL nhưng không được ứng dụng của bạn sử dụng. Chỉ cần thêm một tuyến đường khác sử dụng mẫu: {controller}/{action}/{id}/{name}

Bạn cũng sẽ muốn chuyển đổi tên của mình để đảm bảo rằng nó chỉ có các ký tự hợp lệ cho url. Có rất nhiều bài viết về điều này trên mạng và nó khá đơn giản. Dưới đây là ví dụ: http://chrismckee.co.uk/creating-url-slugs-permalinks-in-csharp/

+0

tốt, đó là nhiều hơn cho trải nghiệm người dùng tốt hơn, lấy ví dụ của rottentomatoes.com , nếu tôi nhấp vào một liên kết >> http://www.rottentomatoes.com/m/the_ides_of_march/ nó sẽ dẫn tôi đến bản ghi đó tại bộ điều khiển m. tôi đã nghĩ rằng họ có thể sử dụng tiêu đề đó như là một chìa khóa trên hồ sơ? Không? và cảm ơn cho liên kết btw! – gdubs