1

我必须不了解有关 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 正常工作?

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

谢谢

4

1 回答 1

0

页面检查几个特殊字段(视图状态和回发事件)以确定请求是否回发。
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>

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

于 2014-09-26T04:09:42.050 回答