2013-04-09 19 views
9

Nếu tôi điều hướng đến URL stackoverflow sau http://stackoverflow.com/questions/15532493 nó sẽ tự động nối với tiêu đề của câu hỏi như vậy:Stackoverflow URL phong cách (tùy URL đi)

http://stackoverflow.com/questions/15532493/mvc-custom-route-gives-404

Đó là, tôi có thể gõ địa chỉ URL vào trình duyệt của tôi mà không cần tiêu đề câu hỏi và nó được nối tự động.

Tôi làm cách nào để đạt được kết quả tương tự trong đơn đăng ký của mình? (Lưu ý: Tôi biết rằng tiêu đề câu hỏi không ảnh hưởng đến trang được hiển thị).

Tôi có bộ điều khiển được gọi là Users với phương thức hành động được gọi là Details. Tôi có định tuyến sau được xác định:

routes.MapRoute("UserRoute", 
    "Users/{*domain}", 
    new { controller = "User", action = "Details" }, 
    new { action = "^Details$" }); 

Vì đây là ứng dụng mạng nội bộ người dùng được xác thực dựa vào tài khoản Windows của họ. Tôi muốn nối thêm tên miền và tên người dùng vào URL.

Nếu tôi tạo ra các URL trong giao diện như sau:

@Html.ActionLink("Model.UserName", "Details", "User", new { domain = Model.Identity.Replace("\\", "/") }) 

tôi nhận được một URL mà trông như thế này:

Domain/Users/ACME/jsmith

Tuy nhiên, nếu người dùng điều hướng đến URL Domain/Users/ bằng cách sử dụng thanh điều hướng trình duyệt, nó khớp với tuyến đường và người dùng được đưa đến trang chi tiết người dùng. Tôi muốn nối thêm ACME/jsmith/ vào URL trong trường hợp này.

Các nghiên cứu tôi đã làm cho đến nay chỉ ra tôi có thể phải thực hiện một đối tượng đường tùy chỉnh bằng cách bắt nguồn từ RouteBase và thực hiện các phương pháp GetRouteDataGetVirtualPath nhưng tôi không biết bắt đầu từ với điều này nơi (các documentaiton MSDN là rất mỏng) .

Vì vậy, những gì tôi muốn biết là:

  1. Có cách nào để đạt được điều này mà không thực hiện một lộ trình tùy chỉnh?
  2. Nếu không, có ai biết về bất kỳ tài nguyên tốt nào để tôi bắt đầu triển khai tuyến đường tùy chỉnh không?
  3. Nếu triển khai tuyến đường tùy chỉnh là bắt buộc, làm cách nào để có được thông tin mà có lẽ phải được tải từ cơ sở dữ liệu? Là nó OK để có một dịch vụ làm cho các cuộc gọi cơ sở dữ liệu trong một tuyến đường (mà có vẻ sai với tôi) hoặc có thể thông tin được chuyển đến các tuyến đường của khuôn khổ MVC?
+1

http://stackoverflow.com/questions/25259/how-does-stackoverflow-generate-its-seo-friendly-urls –

+2

@ Soner Gönül - Câu hỏi được liên kết cho thấy 'cách tạo ra-chuỗi-như-cái này' không phải là điều tôi đang hỏi. Tôi muốn nối các giá trị vào url nếu người dùng chỉ nhập bit 'Domain/Users /' trong thanh điều hướng của trình duyệt. –

+1

Nó không thực sự là một bản sao kể từ khi ông không yêu cầu LÀM THẾ NÀO để tạo ra chuỗi tiêu đề, nhưng thay vì làm thế nào để luôn luôn chuyển hướng đến một trang mà tiêu đề là trong URL ngay cả khi người dùng đã có chỉ bằng cách nhập id – tucaz

Trả lời

2

Nó thực sự khá đơn giản. Vì tiêu đề chỉ có ở đó vì lý do SEO bạn không cần đến câu hỏi thực, nên bộ điều khiển Câu hỏi (trong trường hợp SO) sẽ tải câu hỏi chính xác dựa trên id (trong URL) và chuyển hướng người dùng bằng 301 mã trạng thái.

Bạn có thể thấy hành vi này với bất kỳ thanh tra web

enter image description here

+0

Cảm ơn, đây là những gì tôi đã cố gắng ban đầu nhưng nó không cảm thấy đúng; đoán tôi nên học cách tin tưởng bản năng của mình. Tôi sẽ kiểm tra sau để xem tôi có thể làm việc này không. Tôi có đúng trong suy nghĩ điều này có nghĩa là cơ sở dữ liệu sẽ bị tấn công 2 lần? –

+0

Có, nhưng SO có thể có một số loại bộ nhớ đệm hoặc optmization tại chỗ để họ có thể dịch ID để tiêu đề câu hỏi và không nhấn cơ sở dữ liệu hai lần với tải đầy đủ. – tucaz

+0

Hoạt động hoàn hảo. Cảm ơn nhiều. Tôi hơi khó chịu khi nhấn đúp vào cơ sở dữ liệu nhưng tôi chỉ kéo một lượng nhỏ thông tin xuống và tôi không mong đợi ở bất cứ nơi nào gần lưu lượng truy cập của Stackoverflow vì vậy tôi sẽ vượt qua cây cầu đó và thực hiện chính sách lưu vào bộ nhớ cache nếu nó trở thành một vấn đề. –

1

Bạn có thể làm điều đó client-side với Javascript:

history.pushState({}, /* Title Here */, /* URL Here */); 

Chỉ có nhược điểm không phải là tất cả các trình duyệt hỗ trợ nó.