在 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。