我必须不了解有关 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>
注意 <form> 元素没有runat ='server' 属性。
第一次加载页面时,Page_Load() 触发并且 httpMethod 变量设置为“GET”并且 IsPostback 属性返回 false,这一切都符合预期。
当用户单击“提交”按钮时,Page_Load() 再次触发并且 httpMethod 变量设置为“POST”,因此 ASP.NET 管道显然知道这是一个 POST 动词;但是,IsPostBack 属性仍然返回 false。这对我来说似乎很奇怪。我认为如果 httpMethod 设置为“POST”,IsPostBack 将返回 true。
如果我将 <form> 元素更改为包含 runat='server' 属性,事情会发生一些变化。现在,当用户按下“提交”按钮时,httpMethod 变量设置为“POST”,就像以前一样,但现在 IsPostBack 返回 true。
由于我不需要访问服务器上的 <form> 元素,因此我认为不需要在其上使用 runat='server' 属性。但是由于某种原因, runat='server' 必须出现在 <form> 上,以便 IsPostBack 返回正确的值,即使 HttpContext.Current.Request.HttpMethod 属性返回正确的值而不管 runat= “服务器”属性。
谁能解释为什么<form> 需要 runat='server' 才能使 IsPostBack 正常工作?
注意:请注意,我不是在问如何“做这个”或“做那个”。我的目标是理解“为什么”。
谢谢