2010-03-12 47 views
5

Tôi đang sử dụng Asp.net 2.0. Tôi làm một số server.transfer từ trang 1 đến trang 2. URL vẫn còn trang 1. Bây giờ tôi nhấp vào một liên kết trên trang 2 và điều đó sẽ chuyển tôi sang trang 3. Vì vậy, URL nên ở lại trang 1. Thay vào đó, trình duyệt hiện hiển thị URL của trang 2. Đó có phải là hành vi mong đợi không?Server.transfer thay đổi URL lần thứ hai

Tôi đã thực sự cố gắng ẩn thông số khỏi URL.

  1. Tôi không thể sử dụng response.redirect vì tôi không thể truy cập trang trước từ đây.
  2. Tôi đã thử sử dụng PostBackUrl, nhưng điều đó sẽ không hiệu quả đối với tôi vì tôi cần lưu dữ liệu trên trang hiện tại và sau đó hiển thị trang tiếp theo nếu không có lỗi nào xảy ra. Nếu dữ liệu không chính xác và/hoặc có lỗi, thì tôi cần hiển thị cho người dùng cùng một trang.
  3. Bây giờ tôi đã thử dùng server.transfer, nhưng đó là hiển thị URL của trang trước.

Mọi người có thể chỉ cho tôi đúng hướng không?

+0

Tôi đã kết thúc bằng cách sử dụng phiên và giải quyết vấn đề cho tôi. Nhưng tôi vẫn muốn biết giải pháp cho vấn đề này là gì. –

Trả lời

1

Đây là hành vi mong đợi.

Khi bạn sử dụng Server.Transfer ASP.NET dừng xử lý yêu cầu ban đầu qua ThreadAbortException và sau đó ngay lập tức, trong cùng một chuỗi, bắt đầu xử lý yêu cầu mới. Yêu cầu mới sẽ chạy và gửi đầu ra của nó tới trình duyệt. Trình duyệt không biết gì về số Server.Transfer. Tất cả các trình duyệt đều biết rằng nó đã yêu cầu page1 và máy chủ gửi nó trở lại một số nội dung, như là nhà phát triển mà bạn biết thực sự là từ page2.

Đăng lại là nơi url trang2 bị rò rỉ, nếu nó được dự định bị ẩn. Để nội dung page2 xử lý một postback, nó phải postback tới page2. Nếu nó được đăng trở lại trang 1, page1 sẽ không biết phải làm gì với khung nhìn và sự kiện biểu mẫu vì những sự kiện đó thực sự được tạo bởi page2. Để thực hiện điều này, phần tử <form> được phục vụ theo trang 2 có một số action của page2. Nhìn vào nguồn html của bạn trong trình duyệt sau khi Server.Transfer, bạn sẽ thấy điều này:

<form name="aspnetForm" method="post" action="Page2.aspx" id="aspnetForm"> 

Sử dụng webforms truyền thống, cách duy nhất thực sự để hoàn toàn che giấu địa chỉ URL từ người sử dụng sẽ không sử dụng đăng lại và có tất cả các liên kết trên trang 2 thực sự liên kết ngược trở lại trang1 và thêm tất cả logic vào page1 để xử lý nó một cách thích hợp.

Ngoài ra, bạn không thể sử dụng đăng lại. Nếu bạn đã thực hiện tất cả các hành động thông qua ajax, thì sẽ không có thay đổi url trình duyệt nào cả và bạn sẽ có thể có trải nghiệm tốt hơn cho người dùng dù sao.

Thậm chí tốt hơn là sử dụng ASP.NET MVC để đẩy bạn đến các url giống như REST thân thiện dễ hiểu và bạn có thể ánh xạ tới các tham số phức tạp hơn trong nội bộ.

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