一.asp.net表单提交
问题:
default.aspx代码:
<%@ 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>Test</title>
</head>
<body>
<form id="form1" action="1.aspx" method="post">
<div>
<input id="txtuser" type="text" />
<input id="Submit1" type="submit" value="提交" />
</div>
</form>
</body>
</html>
目标文件1.aspx代码:b.是不是asp.net下表单只能提交到本页即default.aspx只能提交到default.aspx?
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="1.aspx.cs" Inherits="_1" %>
<!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>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<%
string user =Request.Form["txtuser"];
if (user != "")
Response.Write(Request.Form["txtuser"]);
else
Response.Write("你还没有输入任何信息");
%>
</div>
</form>
</body>
</html>
a.如果进行运行的话将会出现在1.aspx中将无法进行处理提交上来的表单,为什么呢??
解决方法:
a.其实这种解决方法很简单,就是在除了提交按钮以外,全部都必须加上“runat=server”,这个是为了能在服务器端根据控件ID来找到此控件,不然将无法找到此控件,因此将不会达到自己预想的结果,所以应该改为如下代码:
<form id="form1" action="1.aspx" method="post">
<div>
<input id="txtuser" type="text" runat="server"/>
<input id="Submit1" type="submit" value="提交" />
</div>
</form>
这样的话就可以很容易的达到提交表单让其他页面来进行处理了
b.当然不是了。很显然可能是受了如下这段代码的影响,才会出现这种想法的:
正确的代码:
<form id="form1" action="1.aspx" method="post">
<div>
<input id="txtuser" type="text" runat="server"/>
<input id="Submit1" type="submit" value="提交" />
</div>
</form>
错误的代码:
<form id="form1" action="1.aspx" method="post" runat="server">
<div>
<input id="txtuser" type="text" runat="server"/>
<input id="Submit1" type="submit" value="提交" />
</div>
</form>
大家注意到了runat="server"了没有 与上面的代码比起来就多了这个这个 这个也是关键所在,当出现runat="server"的时候,它的优先级别比action="1.aspx"高,所以会出现回发的现象,把action给忽略掉,所以就无法进行处理了。
我们可以去掉runat="server"来解决这个问题,还可以在不去掉runat="server"的情况下,根据修改提交按钮,并在提交按钮点击事件当中来解决这个问题。
不去掉runat="server":
将提交控件改为服务器控件:
<form id="form1" action="1.aspx" method="post" runat="server">
<div>
<input id="txtuser" type="text" runat="server"/>
<input id="Submit1" type="submit" value="提交" runat="server"/>
</div>
</form>
然后在提交按钮的控件当中写着:
Server.Transfer("1.aspx");这个时候就可以完成两个页面之间的传递了。注意:这里不可以使用Response.Redirect("1.aspx")否则仍然无法完成此操作。
总结:
1.form中未加runat="server"则需要除了提交按钮以外的所有控件都需要加上"runat=server",提交按钮的位置可以放在表单内的任何地方。
2.form中加了runat="server"则这个时候如果有action则将被忽略掉,提交按钮如果没有成为服务器端控件,而且没有进行Server.Transfer导航处理,则将无法完成
二、跨页提交的另外一种做法
在ASP.NET 1.x的时候,很多朋友可能需要进行跨页提交的处理,也就是从页面A能够提交到页面B,甚至不同的Control其目标处理页面也各不相同。尤其是从ASP/JSP/PHP转过来的开发人员,可能更有这种需求。但很不幸,在ASP.NET 1.x的时候,处理这种跨页请求是十分丑陋的,需要非常多的“技巧化”处理。
在ASP.NET 2.0的时候,对于跨页提交已经有了非常合理的解决方案,以下就是一个示例。
若要获取源页的公共成员,必须先获取对源页的强类型引用。
可以通过多种方法来执行此操作。第一种方法是在目标页中包含一个 @ PreviousPageType 指令,该指令允许您指定源页:
<%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %>
OK,就通过这么简单的两属性设置,就可以非常方便的得到跨页提交的特性。当然,您也可以根据您自己的需求,比如每个Control需要提交到不同的页面来进行更加复杂的设置。
包含此指令时,PreviousPage 属性被强类型化为被引用的源页的类。因此,可以直接引用源页的公共成员。可以使用 type 属性直接指定源页的类型,也可以通过在 VirtualPath 属性中显式引用源页来间接指定源页的类型,如该示例中所示。
下面的代码示例演示源页的一部分,其中包含一个名为 CurrentCity 的公共属性,该属性用于公开名为 textCity 的 TextBox 控件的值。
Visual Basic
Public ReadOnly Property CurrentCity() As String
Get
Return textCity.Text
End Get
End Property
C#
public String CurrentCity
{
get
{
return textCity.Text;
}
}
注意
在源页上创建的、主要用于为跨页发送公开值的属性通常是只读属性。尽管源页可以包含公共读/写属性,但是通过目标页属性设置源页属性一般没有任何效果,因为不会保留此值。
如果目标页中包含指向源页的 PreviousPageType 指令,则可以使用下面的代码访问源页的 CurrentCity 属性。
Visual Basic
Label1.Text = PreviousPage.CurrentCity;
C#
Label1.Text = PreviousPage.CurrentCity;
获取对源页的强类型引用的另一种方法是在引用源页的目标页中包含一个 @ Reference 指令,正如引用要在页中使用的任何类型一样。在此情况下,您可以在目标页中获取目标页的 PreviousPage 属性并将其强制转换为源页类型,如下面的代码示例所示。
Visual Basic 复制代码
Dim sourcePage As SourcePage_aspx
sourcePage = CType(PreviousPage, SourcePage_aspx)
Label1.Text = p.CurrentCity
C# 复制代码
SourcePage_aspx sourcePage;
sourcePage = (SourcePage_aspx) PreviousPage;
Label1.Text = sourcePage.CurrentCity;
检查目标页中的回发
在跨页回发过程中,源页控件的内容被发送至目标页,并且浏览器执行 HTTP POST 操作(不是 GET 操作)。但在目标页中,在跨页发送之后,IsPostBack 属性便立即成为 false。尽管该行为是 POST 的行为,但跨页发送并不是到目标页的回发。因此,IsPostBack 设置为 false,并且目标页可以通过它的第一次代码。
如果这在您的应用程序中有用,则可以确定目标页是否由于跨页发送而正在运行。为此,您可以对目标页的 PreviousPage 属性返回的页引用的 IsCrossPagePostBack 属性进行测试,如下面的代码示例所示。
Visual Basic
If PreviousPage IsNot Nothing Then
If PreviousPage.IsCrossPagePostBack = True Then
Label1.Text = "Cross-page post."
End If
Else
Label1.Text = "Not a cross-page post."
End If
C#
if(PreviousPage != null)
{
if(PreviousPage.IsCrossPagePostBack == true)
{
Label1.Text = "Cross-page post.";
}
}
else
{
Label1.Text = "Not a cross-page post.";
}
请注意,如果当前页不是跨页发送的目标,则 PreviousPage 属性返回 null(在 Visual Basic 中为 Nothing)。
有关更多信息,请参见如何:确定调用 ASP.NET 网页的方式。
跨页发送与 Server.Transfer
PreviousPage 属性和 PreviousPageType 指令在调用目标页的两种情况下都很有用:在跨页回发中(这是一种基于客户端的传输)和使用 Transfer 方法时(这是基于服务器的操作)。在以上两种操作中,目标页中的代码都可以使用 PreviousPage 属性获取对源页的引用。
在目标页中,确定页是通过跨页发送还是 Server.Transfer 操作调用可能很重要。为了帮助您执行此操作,Page 类公开了一个名为 IsCrossPagePostBack 的属性。有关详细信息,请参见如何:确定调用 ASP.NET 网页的方式。