跨页传递

作者:vkvi 来源:ITPOW(原创) 日期:2007-11-19

在 ASP.NET 里面,我们给 <form runat="server" 指定 action 是无效的,也就是说页面总是提交给本页面,如果我们要提交给另一个页面,怎么处理呢?这就是本页要探讨的问题。

给按钮指定 PostBackUrl 使 form 提交给第三方

PostBackUrl 为要提交的目标网页地址,当点击该按钮时触发一个 JavaScript 函数,从而实现提交。也就是说这是由 JavaScript 触发的,客户端不支持 JavaScript 的话,将无法实现提交。

<asp:Button ID="btn" runat="server" Text="提交到第三方网页" PostBackUrl="~/Target.aspx" />

第三方处理

法一、利用 Request.Form 处理

由于 Request.Form 无法实现许多 ASP.NET 的特性,所以抛弃此做法。

法二、第三方查找提交方的控件

第三方网页的部分代码:

    void Page_Load(object sender, EventArgs e)
    {
        if (Page.IsCrossPagePostBack)
        {
            TextBox tb = (TextBox)PreviousPage.Form.FindControl("tb"); //在提交方网页中查找控件 tb
            lb.Text = tb.Text;
        }
    }

IsCrossPagePostBack 表示该页面是否是从其它地方提交而执行的。

PreviousPage 表示提交方网页。

"tb" 为提交方的控件 ID 名称。

法三、通过提交方暴露属性

法二最大的缺点就是过于依赖提交方的控件,法三就是要解决这个问题。

提交方类代码:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : System.Web.UI.Page
{
    public string tbValue
    {
        get
        {
            return tb.Text;
        }
    }
}

提交方网页代码:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:TextBox ID="tb" runat="server"></asp:TextBox>
    <div>
        <asp:Button ID="btn" runat="server" Text="提交到第三方网页" PostBackUrl="~/Target.aspx" />
    </div>
    </form>
</body>
</html>

第三方网页代码:

<%@ Page Language="C#" %>
<%@ PreviousPageType VirtualPath="~/Default.aspx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
    void Page_Load(object sender, EventArgs e)
    {
        if (PreviousPage != null)
        {
            lb.Text = PreviousPage.tbValue;
        }
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:Label ID="lb" runat="server"></asp:Label>
    </div>
    </form>
</body>
</html>

指令 @ PreviousPageType 表示提交方网页的类型,除了具有 VirtualPath 属性外,还具有 TypeName 属性,TypeName 类似用法请参见 ASP.NET 网页模板-访问母版资源(二)

tbValue 为提交方指定的类属性之一。

这里不能再指定 Page.IsCrossPagePostBack,而是用 PreviousPage != null。

相关文章