2010-03-12 64 views
5

我正在使用Asp.net 2.0。我做了一个server.transfer从第1页到第2页。该URL仍然是第1页。现在我单击第2页上的链接,这会将我转到第3页。因此,该网址应保留在第1页。相反,浏览器现在显示第2页。这是预期的行为?Server.transfer第二次更改URL

我实际上是试图隐藏URL中的参数。

  1. 我不能使用response.redirect,因为我无法从这里访问上一页。
  2. 我试过使用PostBackUrl,但这对我不起作用,因为我需要将数据保存在当前页面上,然后在没有错误发生时显示下一页。如果数据不正确,和/或有错误,那么我需要向用户显示相同的页面。
  3. 现在我想尝试server.transfer,但它显示了上一页的URL。

任何人都可以指向正确的方向吗?

+0

我结束了使用会话,并为我解决了这个问题。但是我仍然想知道这个问题的解决方案是什么。 – 2010-03-12 22:20:28

回答

1

这是预期的行为。

当您使用Server.Transfer ASP.NET停止通过ThreadAbortException处理原始请求,然后立即在同一线程中开始处理新请求。新请求运行并将其输出发送到浏览器。浏览器不知道任何关于Server.Transfer。所有浏览器都知道它请求了page1,服务器将它发回了一些内容,作为开发人员,你知道其实是来自page2。

回传是page2 url泄漏出去的地方,如果它意图被隐藏。为了让page2内容处理回发,它必须回发到page2。如果它重新发布到page1,page1将不知道如何处理viewstate和表单事件,因为它们实际上是由page2生成的。为了实现这一点,page2提供的<form>元素的actionpage2。看看在Server.Transfer后的浏览器你的HTML源代码,你会看到这一点:

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

使用传统的WebForms,完全隐藏来自用户的URL唯一真正的方法是不使用回发,并拥有所有页面2上的链接实际上链接回页面1,并将所有逻辑添加到page1中以适当地处理它。

或者,您根本无法使用回发。如果您通过ajax执行了所有操作,那么根本没有浏览器URL更改,您应该能够为用户获得更好的体验。

更好的办法是使用ASP.NET MVC,它将您推向友好的REST式的URL,这对用户来说很容易理解,并且您可以在内部映射到更复杂的参数。

相关问题