phép nói rằng bạn có một phương pháp hành động để trưng bày sản phẩm trong một giỏ mua hàngLàm thế nào để ngăn chặn Url.RouteUrl (...) từ kế thừa các giá trị đường từ yêu cầu hiện tại
// ProductsController.cs
public ActionMethod Index(string gender) {
// get all products for the gender
}
Ở những nơi khác, trong quảng cáo tiêu đề đó là hiển thị trên tất cả các trang web mà bạn đang sử dụng Url.RouteUrl
để tạo liên kết HREF đến các trang khác trên trang web:
<a href="<%= Url.RouteUrl("testimonials-route", new { }) %>" All Testimonials </a>
testimonials-route
này được định nghĩa trong global.ascx
bằng con đường đầu tiên dưới đây. Lưu ý rằng lệnh gọi ở trên đến RouteUrl
không cung cấp số gender
, nhưng tuyến đường được xác định với mặc định là 'trung lập', vì vậy chúng tôi dự kiến sẽ được gọi Testimonials.Index ("trung lập").
routes.MapRoute(
"testimonials-route",
"testimonials/{gender}",
new { controller = "Testimonials", action = "Index", gender = "neutral" },
new { gender = "(men|women|neutral)" }
);
routes.MapRoute(
"products-route",
"products/{gender}",
new { controller = "Products", action = "Index", gender = (string)null },
new { gender = "(men|women|neutral)" }
);
Nếu ai đó truy cập trang /products/women
chúng tôi nhận được một HREF để /testimonials/women
Nếu ai đó truy cập trang /products
sau đó chúng tôi nhận được một HREF rỗng (cuộc gọi đến RouteUrl trả về null).
Nhưng điều đó không có ý nghĩa gì? testimonials-route
được cho là mặc định là 'neutral'
đối với chúng tôi nếu chúng tôi không cung cấp giá trị tuyến đường cho nó?
gì hóa ra đang xảy ra là Url.RouteUrl(routeName, routeValues)
mở rộng helper đầu tiên sẽ nhìn vào thông số routeValues
của nó cho một giá trị gender
tuyến đường và nếu nó không tìm thấy nó trong từ điển mà nó sẽ xem xét các URL hiện tại mà chúng ta đang ở trên (hãy nhớ rằng Url là một đối tượng UrlHelper có ngữ cảnh của yêu cầu hiện tại có sẵn cho nó).
Điều này có tác dụng tốt cho chúng tôi liên kết đến lời chứng thực của nam giới nếu chúng tôi đang ở trên trang sản phẩm dành cho nam giới, nhưng điều đó có thể không phải là điều chúng tôi muốn nếu chúng tôi không vượt qua giá trị trong cuộc gọi RouteUrl
. được chỉ định 'trung lập' làm mặc định trong tệp global.asax.cs
.
Trong trường hợp chúng tôi truy cập /products/
, chúng tôi đã kích hoạt tuyến đường 'products-route'
và phương pháp Products(null)
đã được gọi. Cuộc gọi đến Url.RouteUrl()
thực sự thừa kế giá trị null này cho gender
khi chúng tôi tạo URL bằng cách sử dụng testimonials-route
. Mặc dù chúng tôi đã chỉ định mặc định cho gender
trong 'testimionials-route
'nó vẫn sử dụng giá trị null này khiến tuyến đường bị lỗi và RouteUrl
trả về giá trị rỗng. [lưu ý: tuyến đường không thành công vì chúng tôi có ràng buộc về (nam | nữ | trung tính) và không phù hợp với điều đó]
Thực tế sẽ đáng sợ hơn - trong 'bộ điều khiển' và 'hành động' có thể được kế thừa trong theo cùng một cách. Điều này có thể dẫn đến các URL được tạo ra hoàn toàn cho bộ điều khiển sai ngay cả khi gọi RouteUrl (...) với tên tuyến đường rõ ràng có bộ điều khiển mặc định.
Trong trường hợp này một khi bạn đã tìm ra nó, bạn có thể sửa chữa nó khá dễ dàng theo nhiều cách, nhưng nó có thể trong các trường hợp khác gây ra một số hành vi nguy hiểm. Điều này có thể là do thiết kế, nhưng nó chắc chắn đáng sợ.
thêm tiền thưởng một năm rưỡi sau câu hỏi ban đầu vì (a) tôi muốn biết liệu khuôn khổ hiện có thực hiện điều này cho tôi không và (b) tôi rất tò mò tại sao điều này chỉ có 2 upvotes. nghĩ rằng nó sẽ là một vấn đề phổ biến vì vậy tự hỏi nếu tôi đang làm điều gì đó sai trái! –
điều này đã khởi động tính năng khởi động của tôi, vì thẻ {domain} thiếu giá trị, nhưng hệ thống được cho là sẽ tự động cung cấp. Khi tôi thay đổi điều này, nó đã hoạt động. –
tại sao bạn không chỉ gọi RenderUrl như: '" '- vậy, không có gì bị ghi đè . – Gerwald