IsPostBack总是返回false吗?

3
我遇到了一个奇怪的问题。每次刷新页面,IsPostBack都是false。
为了确保我的内容或母版页中没有任何问题,我创建了一个空的Web表单并在调试模式下启动它。然而,在postbacks时,IsPostBack仍然被设置为false。
我在web.config中设置了enableSessionState="true"<sessionState timeout="30" />
这让我感到非常困扰!
更新:我通过按F5键来刷新页面。根据答案,这不应该导致postback。我想知道当用户刷新页面(甚至手动刷新)时,是否有解决方案可以防止对db进行某些修改。有没有解决办法?

3
当你说“刷新页面”时,是指手动刷新还是通过点击服务器端控件(例如按钮)来刷新? - keyboardP
是的,我已将“enableViewstate”设置为true。 - Kamyar
2
@Kamyar - 按下 F5 不会导致 postback,所以你的代码没有问题。(请检查答案) - keyboardP
1
听起来你需要另一种机制来检测页面是否已刷新,例如计数器。ViewState、Session、隐藏字段 - 有很多选择。 - TheGeekYouNeed
@Kyle Trauberman:谢谢,非常详尽的回答。 - Kamyar
显示剩余5条评论
5个回答

11

刷新页面(按下F5或在您的浏览器中点击刷新按钮)并不是一个PostBack。 PostBack发生在单击按钮、更改下拉列表或页面上的其他事件引起数据被发送到服务器时(通过HTTP POST,因此称为“postback”)。

您的问题没有明确表明您是手动刷新页面还是通过按钮单击或其他事件向服务器提交回发。

由于您是手动刷新页面,所以IsPostBack始终为false。

在ASP.NET中有两种类型的请求(某种意义上):

  • 常规请求(例如,用户首次加载页面)
  • PostBack(例如,页面上单击了按钮,将数据发送到服务器)

如果您想在任一情况下跟踪用户之前是否访问过页面,则需要自己进行跟踪。您可以在Session中设置一个变量来实现这个目的:

Session["UserHasVisitedThisPageBefore"] = true;

那么您可以将其用来替代当前的IsPostBack检查:

if(Session["UserHasVisitedThisPageBefore"] != null && (bool)Session["UserHasVisitedThisPageBefore"])
{
    // stuff here
}

谢谢你的回答。但是使用会话状态变量并不是一个好选择,因为每当用户从页面导航时我都必须将其删除,否则,如果用户转到其他页面然后返回,它仍然是错误的。我认为使用隐藏字段来处理这个问题是最好的选择。 - Kamyar

5
当您刷新页面时,IsPostBack应该是false。只有当控件引起postback时(例如服务器端按钮),它才变为true。
编辑-回答您的更新: 您可以使用IsPostBack来确定是否要更新数据库。如果它为false,则不要更新数据库;否则就更新它。
 if(IsPostBack)
 {
   //Update DB
 }

谢谢你的回答。但我的问题是当用户刷新页面时,IsPostBack始终为false。Kyle的答案建议我应该使用会话变量。虽然+1。 - Kamyar

2
听起来你需要其他机制来检测页面是否刷新,比如计数器。ViewState、Session、隐藏域等都是很多选择。

2

在一个使用XSL渲染标记的特定项目中,我遇到了IsPostBack始终为false的问题。因此,我没有依赖于.NET的IsPostBack属性,而是检查了Request.HttpMethod。

例如,如果我需要检查!IsPostBack,则检查Request.HttpMethod ==“GET”。

例如,如果我需要检查IsPostBack,则检查Request.HttpMethod ==“POST”。


不错的想法...除了我的控件为空! - Gary Huckabone

1
每次刷新页面,您基本上都会对该页面执行GET请求。 GET表示在不更改服务器状态的情况下加载页面。IsPostBack = false是绝对正确的行为!
如果您对页面进行POST操作,将会发生回发。然后提交服务器端表单或触发具有autoPostBack的Web控件-这将导致回发。 IsPostBack将为true。

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