页面间的跳转问题

在Web应用程序中,很多时候我们需要跳转到另一页面,将要转向的页面可以是本应用系统的,也可以是本应用系统之外的。为此,我们要么直接跳转,要么提交 到服务器后跳转,为了实现这一功能,在.Net中共有四种不同的方法:超链接、服务器传输、浏览器重定向和跨页面传输。下面我们就来分别介绍下这四种方 法:

一、 超链接

    想必大家都用过HyperLink控件吧,我们设定其NavigateUrl属性后,点击其回跳转到所指的页面,而无需进行服务器回传。

二、 服务器传输

    指的是Server.Transfer方法。

    HttpServerUtility类的Transfer方法将.htm或.aspx页(注:不能是.asp页)的URL作为字符串参数,回发给服务器,接着,终止运行的当前页面开始去请求我们要访问的目的页面。

    在使用Server.Transfer方法时值得注意的一点是,由于在当前的页面调用HttpResponse.End方法的时候总是会引发 ThreadAbortException这个异常。通常这个异常并不是什么问题,只是在基于数据库事务操作的Try….Catch()语句块中出现的时 候,会致使该事务无法被提交。除非明确的捕捉到ThreadAbortException这个异常,我们来看如下的例子:  

 

    Try
    {
       transaction.Commit();    
// 执行事务
       Server.Transfer(“test.aspx ? id = ”  +  id);  // 如果成功行事务则转至相应页面
    }
    Catch(ThreadAbortException ex)
    {
       
// 捕捉该异常
    }
    Catch(Exception ex)
    {
       Transaction.Rollback();                
// 事务的回滚操作
    }
    Finally
    {
       Connection.Close();              
// 关闭数据库连接
    }

 

    此外,使用Server.Transfer方法源页和目标页必须在同一个应用程序中。而且该方法在使用的时候不验证当前用户是否有权限查看目标页。如果这对于你的应用系统来说这点很重要的话(如在系统中涉及到权限管理的话),不要用该方法。

    当重定向到新页面后,你细心的话会注意到浏览器地址栏中的URL还是原来页面的地址,而不是当前页的。浏览器的历史记录也不会显示这次跳转,因而单击浏览器的“后退“按钮一般也不会回退到原来页面。

    在Server.Transfer的重载方法中,提供了一个Boolean类型的参数,如果该参数设为true的话则会保留原来页的QueryString和Form集合,这对于需要将完整的控制传送到另一页面时,这个重载方法将非常有用。默认为false。

    记住:在一个页面转到另一个页面的过程中(即使视图状态存储在隐藏窗体字段中,这些数据也不会被保存)。这是因为视图状态时页面级的,因而用Server.Transfer方法跳转到另一页面时,视图状态会失效。


三、 浏览器重定向

    指的是Response.Redirect方法

    HttpResponse类中的Redirect方法相当于一个可编程的HyperLink。该方法将.htm或.aspx页面(注:不能是.asp页) 的URL地址作为字符串参数,不经过服务器的回传,客户端直接执行重定向。因此相比之下比Server.Transfer方法相应速度更快。由于它完全是 一个新的服务器请求,因此会强制进行完整的验证和授权。

    除非在用一应用中,否则数据时不能从源页传送到目标页的。在这种情况下,数据可以利用会话状态或者应用程序状态来实现传递。

    和Server.Transfer方法一样,Response.Redirect的重载方法中也有一个Boolean类型的参数,如果该参数为true则表示当前页的执行应被终止。

四、 跨页面传输

    页面可以被提交到服务器,然后直接发送到另一个页面。通过特定控件的PostBackUrl属性我们就可以实现这种功能。当这种方法只能发送到另一个.aspx页面而非.asp或.htm页面,当前页的控件可通过Page.PreviousPage属性实现访问。

    如果源页和目标页同在一应用系统中,则可以共享会话状态和应用程序状态,以及源页的公共成员。页面可跨页发送到应用程序之外的另一页面,但目标页无法使用源页的数据。

    如果可访问目标的PreviousPage属性,则源页将被再次实例化,同时还要恢复来自源页的视图状态。因此,使用PreviousPage属性的执行性能直接受到源页存储的视图状态数据大小的影响。

    在随笔中有什么错误之处请大家多多批评,多多交流!

    我做了个Demo,将后三种方法实现了下,大家可以看看效果(点击 下载

你可能感兴趣的:(问题)