为什么IsPostBack需要runat =" server"在表格上?

时间:2014-09-26 03:40:43

标签: post runatserver ispostback

我不能理解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正常工作?

注意:请注意,我不是在问“如何做”或“做那件事”。我的目标是理解“为什么”。

由于

1 个答案:

答案 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>

服务器控制的表单只是自动添加和填充这些字段。