IsPostBack实际上是什么意思?

7

我想知道Page.IsPostBack具体是什么意思。我完全了解它在标准ASP.NET页面中的日常使用,它表示用户正在将数据提交回服务器端。请参阅Page:IsPostBack Property

但是,考虑到这个HTML:

<html>
   <body>
      <form method="post" action="default.aspx">
         <input type="submit" value="submit" />
      </form>
   </body>
</html>

点击“提交”按钮时,会调用页面的 Page_Load 方法,但 Page.IsPostBack 返回 false。我不想添加 runat=server。如何区分页面的第一次加载和客户端点击“提交”引起的请求?
更新: 我已经添加了一个 <input type="text" value="aa" name="ctrl" id="ctrl" /> 元素以使 Request.Form 有元素,并且 Request.HTTPMethod 是 POST,但 IsPostBack 仍然是 false?
5个回答

12

检查Request.Form集合是否非空。只有POST请求才会在Request.Form集合中包含数据。当然,如果没有表单数据,则该请求与GET请求无法区分。

至于您标题中的问题,“IsPostBack”是在服务器端表单控件的POST请求时设置为true的。使您的表单仅限于客户端,将使此功能失效。


我对你的回答点个赞。我有点落后了,忘记了Request.Forms是从哪里获取原始输入表单数据的。这是正确的答案。不过我还是很好奇,为什么Ian没有设置页面处理呢? - Mark Brittingham
@Mark - 我正在“硬核”地做所有的事情,不要问为什么 :-) - Dead account
+1 @tvanfosson - 我将另一个问题标记为答案,因为我还可以包括“Request.Form.Keys.Count > 0”。 - Dead account

6

一种实现方法是扩展ASP.NET页面类,"重写"IsPostBack属性,并让所有页面都从扩展页面派生。

public class MyPage : Page
{
    public new bool IsPostBack
    {
        get 
        { 
          return 
            Request.Form.Keys.Count > 0 &&
            Request.RequestType.Equals("POST", StringComparison.OrdinalIgnoreCase); 
         }
    }
}

3
这实际上更适合一个名为“IsPost”的属性。 - Kris
编辑以包含 "Request.Form.Keys.Count",然后我可以使用 Request.Form["ctrl"] 从文本框中查找值。 - Dead account

1
在您提出的问题示例中,没有涉及ViewState;服务器无法将此请求与页面先前的请求链接起来并将它们作为一个单元处理。导致单击按钮的请求将与服务器收到的任何其他随机请求一样。

1

通常情况下,您可以将PostBack视为以下内容的组合:

  1. HTTP请求方法等于“POST”
  2. HTTP头HTTP_REFERER等于当前URL

虽然这并不是100%可靠的,因为它不考虑任何状态(即使您不知道也可能需要),但它是一个回传返回到当前页面。


0
你可以检查头文件,看看你的输入控件是否返回值(使用Request.Forms,正如tvanfosson所指出的那样)。然而,真正重要的问题是为什么你不想添加runat=server。除了MVC之外,ASP.NET实现的整个页面处理机制都依赖于通过服务器处理页面输出,以设置适当的客户端代码用于回调等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接