我不能理解aspx页面处理周期的基本内容。请看下面这个简单的例子。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
<div>
<form method="post">
<textarea name="someContent" cols="35" rows="15"></textarea>
<input type="submit"/>
</form>
</div>
</body>
</html>
<script runat="server">
public void Page_Load() {
// The httpMethod is always set correctly to "GET" or "POST"
String httpMethod = HttpContext.Current.Request.HttpMethod;
if(IsPostBack)
DoSomething();
else
DoSomethingElse();
}
</script>
请注意&lt; form&gt; 不的元素具有runat ='server'属性。
第一次加载页面时,会激活Page_Load()并将httpMethod变量设置为“GET”,并且IsPostback属性将返回false,所有这些都按预期进行。
当用户单击“提交”按钮时,Page_Load()再次触发,httpMethod变量设置为“POST”,因此ASP.NET管道显然知道这是一个POST动词;但是,IsPostBack属性仍然返回false。这对我来说似乎很奇怪。我认为如果将httpMethod设置为“POST”,则IsPostBack将返回true。
如果我更改&lt; form&gt;包含runat ='server'属性的元素有些变化。现在,当用户按下“提交”按钮时,httpMethod变量设置为“POST”,就像之前一样,但现在IsPostBack返回true。
因为我无需访问&lt; form&gt;在服务器上的元素,我看到没有必要使用runat ='server'属性。但由于某种原因,runat ='server'必须出现在&lt; form&gt;上为了使IsPostBack返回正确的值,即使HttpContext.Current.Request.HttpMethod属性返回正确的值,无论runat ='server'属性如何。
任何人都可以在&lt; form&gt;上解释为什么 runat ='server'是必要的使IsPostBack正常工作?
注意:请注意,我不是在问“如何做”或“做那件事”。我的目标是理解“为什么”。
由于
答案 0 :(得分:0)
页面检查几个特殊字段(viewstate和postback事件)以确定请求是否回发 http://referencesource.microsoft.com/System.Web/R/ae07c23d0aba6bb9.html
这两种形式都会导致IsPostBack为真:
<%@ Page Language="C#" AutoEventWireup="true" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<p><%= IsPostBack? "POSTBACK" : "NO POSTBACK" %></p>
<form id="form1" runat="server">
<input type="submit" />
</form>
<form id="form2" method="get">
<input type="hidden" name="__EVENTTARGET" value="" />
<input type="submit" />
</form>
</body>
</html>
服务器控制的表单只是自动添加和填充这些字段。