2011-11-25 66 views
1

我正在写我的第一个 asp.net应用程序,并试图使用PreviousPage属性来访问页面之间的数据。 Visual 2010给了我一个我不明白的错误,所以我需要一些帮助来理解我做错了什么。使用vb.net在ASP.net页面之间传递数据

我有一个应用程序,我将使用Transfer在所有页面之间跳动。这样,从用户的角度来看,他所见到的只有一个网址。这个URL将使他登录到应用程序(现在是一个应用程序控制的功能)并连接到数据库。因此,我有我想移交给叫_dbConnection这是我的声明页面类私有变量下一页的SqlClient.SqlConnection对象时...

Partial Class Protocol 
     Inherits System.Web.UI.Page 
     Private _dbconnection As SqlClient.SqlConnection 
     Public ReadOnly Property dbConnection As SqlClient.SqlConnection 
      Get 
       Return _dbConnection 
      End Get 
     End Property 
     ... 

后来下来的代码,以向效应初探点击事件上的按钮

Server.Transfer("PSetup.aspx") 

在PSetup.aspx我有以下

<%@ Page Title="" Language="VB" MasterPageFile="~/MasterPage.master" AutoEventWireup="True" CodeFile="PSetup.aspx.vb" Inherits="PSetup" %> 
<%@ PreviousPageType VirtualPath="~/Protocol.aspx" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> 

哪些应该申报的协议类别按上一页

然而,在PSetup的Page_Load中子我尝试这个

_dbConnection = PreviousPage.dbConnection 

其中在此使用_dbConnection是在新的页面类私有变量。

Visual Studio是给我一个错误“的DbConnection”不是的成员“System.Web.UI.Page”

我已经通过文档阅读这几次,我只是不明白我做错了。请有人帮助我。

回答

0

我想你需要了解的第一件事页之间一个很好的做法传递数据ASP.NET是无状态的。这意味着没有数据在页面之间“保存”。 PreviousPage属性的作用是允许请求信息通过使用Transfer方法而保持不变,并且请求信息将是GET或POST变量。

恕我直言,做你想做的事情的最佳方式是拥有一个与任一页面无关的共享公共类,并且有一个获取SqlConnection的公共函数。记住,它是无状态的,所以你将不得不每次创建连接。

另一种方法是在会话中保存dbConnection(我不建议这样做,因为它可以查看会话信息)。

否则,您不能让页面之间的信息持续存在变量。那是什么意思是无国籍。

另外,对于PreviousPage,请记住它正在创建System.Web.UI.Page的实例,而不是Protocol的实例。这意味着公共财产不会从Protocol存在,只有Page的本地功能将在那里。

编辑

msdn

所创建的主要揭露了跨页投递通常只读属性值的源页面上的属性。虽然源页面可以包含公共读/写属性,但从目标页面属性设置源页面属性通常没有用处,因为该值不会被持久化。

+0

从我的(主要)linux/apache/php背景我明白无状态。然而,asp.net肯定给人的印象是页面对象存在于请求之间 - 页面类(实例)中的所有私有变量似乎保持状态,同时由于事件发生在客户端页。微软的例子讨论的是强制类型到实际页面的PreviousPage,然后继续给出一个“CurrentCity”的例子作为一个可以被检索的属性。我看不到的是我的例子与众不同。 – akc42

+0

嘿,那绝对是我的错!当添加了“<%@ PreviousPageType VirtualPath =”〜/ SourcePage.aspx“%>”(就像你所做的那样),它确实是强类型的(否则,它使用Page.PreviousPage属性完成,它被键入作为页面)。但是,我发现这个例子,它的工作原理是因为'CurrentCity'是一个公共属性,它返回一个文本框的值,它通过请求信息持久化。例如,它不会返回在上一页的页面加载中设置的任意字符串。 –

+0

页面会记住控件的状态,因为它们存储在ViewState中。我认为在你的情况下,你可以在会话中保存sqlConnection,但它不是很好的做法。 – CoffeeCode

0

尽量让DBConnection的变量作为共享

Partial Class Protocol 
    Inherits System.Web.UI.Page 
    Private Shared _dbconnection As SqlClient.SqlConnection 
    Public Shared ReadOnly Property dbConnection As SqlClient.SqlConnection 
     Get 
      Return _dbConnection 
     End Get 
    End Property 

但我不知道这是否是这样

+0

Microsoft示例不会共享 - 请参阅http://msdn.microsoft.com/en-us/library/ms178139.aspx。我担心共享是危险的 - 不会共享意味着不同用户的页面都共享相同的连接? (在这种情况下,它可能并不重要 - 但我有其他的值,我希望在页面之间传递 - 这只是第一个例子 - 我正在移植一个窗体应用程序,它以类似的方式) – akc42

+0

为什么你不通过查询字符串或会话传递数据吗? – CoffeeCode