[转帖]Asp.net页面之间通过脚本传递数据
Asp.net页面之间通过脚本传递数据
新建一个 WebForm1.aspx页面,添加一个TextBox和一个Button控件,在页面的Page_Load里写下注册客户端脚本的语句:
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!Page.IsClientScriptBlockRegistered("clientScript"
)
{
StringBuilder sbScript = new StringBuilder();
sbScript.Append("<script>/n"
;
sbScript.Append("function OpenWin(){/n"
;
sbScript.Append("var str=window.showModalDialog('WebForm2.aspx',document.Form1.txtWndName.value)/n"
;
sbScript.Append("
if(str!=null)do
cument.Form1.txtWndName.value=str/n"
;
sbScript.Append("
/n</script>/n"
;
string script = sbScript.ToString();
RegisterClientScriptBlock("clientScript",script);
}
this.btnOpen.Attributes.Add("OnClick","OpenWin()"
;
}
新建一个WebForm2.aspx页面,放入两个框架:
<frameset rows="0,*">
<frame src="about:blank"
<frame src="WebForm3.aspx">
</frameset>
新建一个WebForm3.aspx页面,在Page_Load里写下一下注册脚本的语句:
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(Page.IsPostBack)
{
StringBuilder sbScript = new StringBuilder();
sbScript.Append("<script>/n"
;
sbScript.Append("window.parent.returnValue='"
+ this.TextBox1.Text + "'/n"
;
sbScript.Append("window.parent.close()/n"
;
sbScript.Append("</script>/n"
;
string script = sbScript.ToString();
if(!Page.IsClientScriptBlockRegistered("clientScript"
)
{
RegisterClientScriptBlock("clientScript",script);
}
}
}
通过JavaScript的弹出窗口实现数据传递。
虽然超级链接能够从一个页面导航......
虽然超级链接能够从一个页面导航到另一个页面,但这种导航方式是完全由用户控制的。有些时候,我们可能要用代码来控制整个导航过程,包括何时转到另一个页面。在这些场合,ASP.NET有三种不同的方式可以达到相似的目的:调用Response对象的Redirect方法,调用Server对象的Transfer或Execute方法。这三种导航方式的行为基本相似,但也有区别。
2.1 Response.Redirect
Response.Redirect方法导致浏览器链接到一个指定的URL。当Response.Redirect()方法被调用时,它会创建一个应答,应答头中指出了状态代码302(表示目标已经改变)以及新的目标URL。浏览器从服务器收到该应答,利用应答头中的信息发出一个对新URL的请求。
这就是说,使用Response.Redirect方法时重定向操作发生在客户端,总共涉及到两次与服务器的通信(两个来回):第一次是对原始页面的请求,得到一个302应答,第二次是请求302应答中声明的新页面,得到重定向之后的页面。
2.2 Server.Transfer
Server.Transfer方法把执行流程从当前的ASPX文件转到同一服务器上的另一个ASPX页面。调用Server.Transfer时,当前的ASPX页面终止执行,执行流程转入另一个ASPX页面,但新的ASPX页面仍使用前一ASPX页面创建的应答流。
如果用Server.Transfer方法实现页面之间的导航,浏览器中的URL不会改变,因为重定向完全在服务器端进行,浏览器根本不知道服务器已经执行了一次页面变换。
默认情况下,Server.Transfer方法不会把表单数据或查询字符串从一个页面传递到另一个页面,但只要把该方法的第二个参数设置成True,就可以保留第一个页面的表单数据和查询字符串。
同时,使用Server.Transfer时应注意一点:目标页面将使用原始页面创建的应答流,这导致ASP.NET的机器验证检查(Machine Authen
tication Check,MAC)认为新页面的ViewState已被篡改。因此,如果要保留原始页面的表单数据和查询字符串集合,必须把目标页面Page指令的EnableViewStateMac属性设置成False。
2.3 Server.Execute
Server.Execute方法允许当前的ASPX页面执行一个同一Web服务器上的指定ASPX页面,当指定的ASPX页面执行完毕,控制流程重新返回原页面发出Server.Execute调用的位置。
这种页面导航方式类似于针对ASPX页面的一次函数调用,被调用的页面能够访问发出调用页面的表单数据和查询字符串集合,所以要把被调用页面Page指令的EnableViewStateMac属性设置成False。
默认情况下,被调用页面的输出追加到当前应答流。但是,Server.Execute方法有一个重载的方法,允许通过一个TextWriter对象(或者它的子对象,例如StringWriter对象)获取被调用页面的输出,而不是直接追加到输出流,这样,在原始页面中可以方便地调整被调用页面输出结果的位置。
为说明其工作过程,下面我们创建一个Web表单,放入一个按钮控件(Button1)和一个文本控件(Literal1),在设计界面中转入代码视图,加入一个System.IO名称空间的Imports语句,然后加入用户点击按钮时执行的代码:
Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
Dim sw As StringWriter = New StringWriter()
Server.Execute("WebForm2.aspx", sw)
Literal1.Text = sw.ToString()
End Sub
然后为同一个Web应用创建第二个页面WebForm2.aspx。转入该页面的HTML视图,修改其Page指令禁止ViewState检查:
<%@ Page Language="vb"
AutoEventWireup="false"
Codebehind="WebForm2.aspx.vb"
Inherits="Navigate.WebForm2"
EnableViewStateMac="false"%>
再转到设计视图,为第二个页面增加一些控件。接下来,把第一个页面设置成默认页面,启动应用。点击按钮,WebForm2的控件将显示在WebForm1中放置Literal按钮的地方,如图一,注意页面标题和URL仍旧显示原始页面WebForm1。
图一:用Server.Execute合并两个源文件的页面
用Server.Transfer或Server.Execute方法实现导航时,还要注意一点:最后得到的页面可能不是合法的HTML页面,因为最终返回给客户端的页面可能包含多个<HTML>和<BODY>等标记。IE浏览器看来能够容忍并正确处理这类情形,但如果用户要用到其他的浏览器,最好仔细测试一下。
三、比较与选择
既然从一个页面导航到另一个页面的办法有这么多,应该如何选择最佳的导航方式呢?下面是一些需要考虑的因素:
·如果要让用户来决定何时转换页面以及转到哪一个页面,超级链接最适合。
·如果要用程序来控制转换的目标,但转换的时机由用户决定,使用Web服务器的HyperLink控件,动态设置其NavigateUrl属性。
·如果要把用户连接到另一台服务器上的资源,使用Response.Redirect。
·用Response.Redirect把用户连接到非ASPX的资源,例如HTML页面。
·如果要将查询字符串作为URL的一部分保留,使用Response.Redirect。
·如果要将执行流程转入同一Web服务器的另一个ASPX页面,应当使用Server.Transfer而不是Response.Redirect,因为Server.Transfer能够避免不必要的网络通信,从而获得更好的性能和浏览效果。
·如果要捕获一个ASPX页面的输出结果,然后将结果插入另一个ASPX页面的特定位置,则使用Server.Execute。
·如果要确保HTML输出合法,请使用Response.Redirect,不要使用Server.Transfer或Server.Execute方法。默认情况下,Server.Tr......
默认情况下,Server.Transfer方法不会把表单数据或查询字符串从一个页面传递到另一个页面,但只要把该方法的第二个参数设置成True,就可以保留第一个页面的表单数据和查询字符串
大概有点眉目了
我在做一个BBS,因为有“登陆界面”和“发表界面”,想把“登陆界面”输入的ID直接传到“发表界面”。
用Server.Transfer方法没错吧?
还可以用Cookie,Appl......
还可以用Cookie,Application就看你想达到什么目的,怎样的效果了!分享]在 Web 窗体页之间传递值
摘自vs.net帮助
----------------------------------------
在很多时候,您将需要从一页定位到另一页,将值从一页传递到另一页。例如,可能有一页会提示用户提供名称和密码。当用户提交窗体时,您需要调用另一页对用户进行身份验证。
在页之间共享信息的方法有多种:
使用查询字符串,它将信息追加到 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;
}
}