初学者问题:两个不同页面的控件可否直接访问属性值而不通过全局变量? 如果你为了传递值,不要这样做.这是B/S结构,和windows程序非常不同,不要用windows程序的思路考虑B/S结构的程序,你无法保证另一个页面存在,而且http是一个非连接性的协议,页面读取完便失去连接,你无法控制到他了. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Visual Basic 和 Visual C# 概念 在 Web 窗体页之间传递值请参见Web 窗体状态管理 在很多时候,您将需要从一页定位到另一页,将值从一页传递到另一页。例如,可能有一页会提示用户提供名称和密码。当用户提交窗体时,您需要调用另一页对用户进行身份验证。在页之间共享信息的方法有多种: 使用查询字符串,它将信息追加到 URL 并将该 URL 传递到下一页。这种方法存在使信息可见的缺点。有关详细信息,请参见 WebClient.QueryString 属性和 HttpRequest.QueryString 属性。 使用会话状态存储信息,使用户当前会话中的所有页都可以全局访问这些信息。但是,这种方法会占用服务器内存,并且信息仅在会话过期之前存储,从而比向下一页传递信息具有更多的系统开销。有关详细信息,请参见 Web 窗体状态管理。 使用自定义页属性,然后从初始页重定向到目标页,此时仍可以读取旧页上的值。此策略在本主题中描述。 Web 窗体页是应用程序中的类,因此可以向处理任何类一样为它们创建属性。但是,由于 Web 窗体页实际上仅在执行页的过程中存在,它们的生命周期非常短。因此,Web 窗体页上属性的用途相当有限,因为它们仅在处理页的过程中存在。但是,如果使用特定的技术将控件从一页传递到另一页,后一页仍可以访问前一页上的属性。在源页上创建可共享的值 在代码中,使用属性的标准语法声明页上的一项或多项只读属性。返回要向下一页传递的属性值。 以下示例显示如何声明名为 Property1 的属性并将它的值设置为该页上文本框的值: ' Visual BasicPublic ReadOnly Property Property1() As String Get Return TextBox1.Text End GetEnd Property// C#public string Property1{ get { return TextBox1.Text; }}通过调用 Server 对象(HttpServerUtility 类)的 Transfer 方法调用下一页,并向其传递要将信息传递到的页的 URL。 以下示例显示如何从事件处理程序中调用名为 WebForm2 的页(在同一项目中): ' Visual BasicPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Server.Transfer("Webform2.aspx") End Sub// C#private void Button1_Click(object sender, System.EventArgs e){ Server.Transfer("Webform2.aspx");}若要从所调用的页中获取第一页的属性值,请创建源页类的实例变量。然后可以向其分配 HTTP 对象(IHttpHandler 类的一个实例),即接收初始请求的对象。在所调用的页中读取源页中的属性值 创建一个全局实例变量,它被类型化为源页的类。 以下示例显示如何声明类型为 WebForm1 且名为 sourcepage 的变量: ' Visual Basic' Put immediately after the Inherits statements' at the top of the filePublic sourcepage As WebForm1// C#// Put immediately after the opening brace of the classpublic class WebForm3 : System.Web.UI.Page { public WebForm1 sourcepage; // etc.在 Page_Load 处理程序中,从 Context.Handler 对象(IHttpHandler 接口)中获取源页,然后向其分配在第 1 步创建的变量。必须将该处理程序对象转换为源页类的类型。 注意 只应在该页首次运行(即首次从源页中调用该页)时执行此逻辑。从源页中获取属性值,并按照使用任何对象属性的方式来使用这些属性值。 注意 如果要在除第一页初始化阶段之外的任何页处理阶段中使用属性值,则务必要保存这些属性值(例如以视图状态保存)。有关详细信息,请参见 Web 窗体状态管理介绍。完整的 Page_Load 处理程序可能类似于如下所示: ' Visual BasicPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load If Not Page.IsPostBack Then sourcepage = CType(Context.Handler, WebForm1) Label1.Text = sourcepage.Property1 End IfEnd Sub// C#private void Page_Load(object sender, System.EventArgs e){ if (!IsPostBack){ WebForm1 sourcepage = (WebForm1) Context.Handler; Label1.Text = sourcepage.Property1; }}请参见Web 窗体状态管理 --------------------------------------------------------------------------------向 Microsoft 发送有关此主题的反馈© Microsoft Corporation。保留所有权利。 我现在用的是session变量,这样有什么缺点吗? 如果是简单的,没有安全性要求的文字或数字的值,可以通过QueryString来传递,就是在链接里加入a.aspz?name=bill&sex=femaleASP里经典的方法,ASP.NET里也经常用。 不行,用url带参数的方式传递 楼上的不行是什么意思啊?用session变量不行? 用session可以的或者Response.Redirect("page2.aspx?Channels=-1"); MVC在母板页中使用RouteLink地址变化 visual studio 2005 遇到了问题,需要关闭,这怎么解决? ckeditor在ie下为毛是这样子 Web服务 关于application/x-msdownload的问题 如何解读动网的IP数据库,谢谢! ExecuteScalar()提示缺少一个参数,怎么回事? 怎么样解决多语言问题?急!!! 编译一个.net工程遇到的问题 一个小问题 DataGrid弹出窗口 一直等,今晚不搞掂不睡觉 求c#操作owc中Spreadsheet的例子或相关资料???
Web 窗体状态管理
在很多时候,您将需要从一页定位到另一页,将值从一页传递到另一页。例如,可能有一页会提示用户提供名称和密码。当用户提交窗体时,您需要调用另一页对用户进行身份验证。在页之间共享信息的方法有多种: 使用查询字符串,它将信息追加到 URL 并将该 URL 传递到下一页。这种方法存在使信息可见的缺点。有关详细信息,请参见 WebClient.QueryString 属性和 HttpRequest.QueryString 属性。
使用会话状态存储信息,使用户当前会话中的所有页都可以全局访问这些信息。但是,这种方法会占用服务器内存,并且信息仅在会话过期之前存储,从而比向下一页传递信息具有更多的系统开销。有关详细信息,请参见 Web 窗体状态管理。
使用自定义页属性,然后从初始页重定向到目标页,此时仍可以读取旧页上的值。此策略在本主题中描述。
Web 窗体页是应用程序中的类,因此可以向处理任何类一样为它们创建属性。但是,由于 Web 窗体页实际上仅在执行页的过程中存在,它们的生命周期非常短。因此,Web 窗体页上属性的用途相当有限,因为它们仅在处理页的过程中存在。但是,如果使用特定的技术将控件从一页传递到另一页,后一页仍可以访问前一页上的属性。在源页上创建可共享的值 在代码中,使用属性的标准语法声明页上的一项或多项只读属性。返回要向下一页传递的属性值。
以下示例显示如何声明名为 Property1 的属性并将它的值设置为该页上文本框的值: ' Visual Basic
Public ReadOnly Property Property1() As String
Get
Return TextBox1.Text
End Get
End Property// C#
public string Property1
{
get
{
return TextBox1.Text;
}
}
通过调用 Server 对象(HttpServerUtility 类)的 Transfer 方法调用下一页,并向其传递要将信息传递到的页的 URL。
以下示例显示如何从事件处理程序中调用名为 WebForm2 的页(在同一项目中): ' Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Server.Transfer("Webform2.aspx")
End Sub// C#
private void Button1_Click(object sender, System.EventArgs e)
{
Server.Transfer("Webform2.aspx");
}
若要从所调用的页中获取第一页的属性值,请创建源页类的实例变量。然后可以向其分配 HTTP 对象(IHttpHandler 类的一个实例),即接收初始请求的对象。在所调用的页中读取源页中的属性值 创建一个全局实例变量,它被类型化为源页的类。
以下示例显示如何声明类型为 WebForm1 且名为 sourcepage 的变量: ' Visual Basic
' Put immediately after the Inherits statements
' at the top of the file
Public sourcepage As WebForm1// C#
// Put immediately after the opening brace of the class
public class WebForm3 : System.Web.UI.Page
{
public WebForm1 sourcepage;
// etc.
在 Page_Load 处理程序中,从 Context.Handler 对象(IHttpHandler 接口)中获取源页,然后向其分配在第 1 步创建的变量。必须将该处理程序对象转换为源页类的类型。
注意 只应在该页首次运行(即首次从源页中调用该页)时执行此逻辑。
从源页中获取属性值,并按照使用任何对象属性的方式来使用这些属性值。
注意 如果要在除第一页初始化阶段之外的任何页处理阶段中使用属性值,则务必要保存这些属性值(例如以视图状态保存)。有关详细信息,请参见 Web 窗体状态管理介绍。
完整的 Page_Load 处理程序可能类似于如下所示: ' Visual Basic
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not Page.IsPostBack Then
sourcepage = CType(Context.Handler, WebForm1)
Label1.Text = sourcepage.Property1
End If
End Sub// C#
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack){
WebForm1 sourcepage = (WebForm1) Context.Handler;
Label1.Text = sourcepage.Property1;
}
}
请参见
Web 窗体状态管理 --------------------------------------------------------------------------------向 Microsoft 发送有关此主题的反馈© Microsoft Corporation。保留所有权利。
ASP里经典的方法,ASP.NET里也经常用。
或者Response.Redirect("page2.aspx?Channels=-1");