如何在ASP.NET中刷新页面?(让它通过代码重新加载自身)


158

如何在ASP.NET中刷新页面?(让它通过代码重新加载自身)

我宁愿不使用Response.Redirect(),因为我不知道我是否会进入该页面,因为它位于共享点内webpart内的用户控件内。


2
我不是OP,但是一个原因可能是因为可以禁用JavaScript
Nathan Koop

11
ASP.NET依赖于javascript,因此,如果用户禁用了javascript,则存在更大的问题……
jrummell

Answers:


45

将页面呈现给客户端后,您只有两种方式可以强制刷新。一是Javascript

setTimeout("location.reload(true);", timeout);

第二个是元标记:

<meta http-equiv="refresh" content="600">

您可以在服务器端设置刷新间隔。


我应该在哪里放置setTimeout?
Siti 2014年

请参阅下面来自@gaurav的答案,以找到在.NET中使用的好方法Server.TransferRequest
sfarbota

这对于不使用服务器端支持的页面可能是正确的,但是相对于指定的.Net是错误的。正确的方法是使用Response.Redirect。
Phill Healey 2015年

394

在我的用户控件中,更新数据后,我执行了以下操作:

  Response.Redirect(Request.RawUrl);    

这样可以确保页面被重新加载,并且可以通过用户控件正常运行。您使用RawURL,而不Request.Url.AbsoluteUri保留任何可能包含在请求中的GET参数。

您可能不想使用:__doPostBack,因为许多aspx页面在执行回发时的行为会有所不同。


4
@chris您会使用第二个参数作为Response.Redirect(Request.RawUrl,false)吗?显然,这是使用reponse.redirect的最佳实践。你怎么看?
aleafonso 2012年

@aleafonso:我从来没有亲自使用过第二个参数,因此也没有任何问题,因此我不确定它能为您带来什么。但是,是的,根据文档,您应该使用第二个参数,但是仅当您要调用CompleteRequest时才使用,我从来没有打扰过它。
克里斯,2012年

有时,当当前页面具有Id参数时(例如,stackoverflow上的questionId),您可能需要AbsoluteUri。还是我错了?
CularBytes 2015年

2
@aleafonso是正确的-除非您需要停止页面上的所有处理(有时表明设计计划不正确),否则应将false传递为第二个参数。不传递第二个参数或传递true会引发HttpException,并且可能影响性能并填充事件日志。
Ripside 2015年

45

这可能会晚了,但是我希望它对正在寻找答案的人有所帮助。

您可以使用以下行执行此操作:

Server.TransferRequest(Request.Url.AbsolutePath, false);

尝试避免使用Response.Redirect它,因为它增加了过程中的步骤。它的实际作用是:

  1. 发送带有重定向标头的页面
  2. 浏览器重定向到目标URL。

如您所见,相同的结果需要2趟而不是1趟。


2
+1指出Server.Transfer()比Response.Redirect()更有效
Jenny O'Reilly 2014年

在Response.Redirect无法正常工作的情况下,这可以工作。
Ed Bayiates

我发现这样不能清除页面的状态,例如设定.Text在一个TextBox.Visible的状态Button

38

试试这个:

Response.Redirect(Request.Url.AbsoluteUri);

1
它只会发送重定向页面而不是页面,从而导致一个循环,当浏览器看到它将永远无法获得真实页面时,它将停止……
Guffa,2009年

2
@Guffa完全取决于使用重定向的上下文。如果在基于动作或条件专门调用的动作/代码块中使用它,则它将仅在每次迭代中触发一次,并且如果正确地进行了隔离编码。
Phill Healey 2015年

这可能导致重定向后会话数据丢失。关于完全限定的URL会使会话混乱。
克里斯·库德莫


8

有多种方法可以刷新asp.net中的页面,例如...

Java脚本

 function reloadPage()
 {
     window.location.reload()
 }

背后的代码

Response.Redirect(Request.RawUrl)

元标记

<meta http-equiv="refresh" content="600"></meta>

页面重定向

Response.Redirect("~/default.aspx"); // Or whatever your page url

6

如果您不想刷新整个页面,那么将要刷新的内容包装在UpdatePanel中然后进行异步回发又如何呢?


3

我个人需要确保页面保持状态,以便所有文本框和其他输入字段都保留其值。通过执行元刷新,它就像一条新帖子一样,IsPostBack始终为false,因此所有控件都再次处于初始化状态。要保留状态,请将其放在Page_Load()的末尾。在连接了事件的页面上创建一个隐藏按钮,类似于带有事件butRefresh_Click(...)的butRefresh。这段代码在页面上设置了一个计时器,以触发回发,就像用户自己单击刷新按钮一样。保留所有状态和会话。请享用!(PS,如果您在回发时收到错误,则可能需要将指令放入@Page标头EnableEventValidation =“ false”中。

//tell the browser to post back again in 5 seconds while keeping state of all controls
ClientScript.RegisterClientScriptBlock(this.GetType(), "refresh", "<script>setTimeout(function(){ " + ClientScript.GetPostBackClientHyperlink(butRefresh, "refresh") + " },5000);</script>");

2

你不能那样做。如果使用重定向(或任何其他服务器技术),则永远不会将实际页面发送到浏览器,而只会发送重定向页面。

您必须使用meta标记或JavaScript来执行此操作,以便您可以在页面显示一段时间后重新加载页面:

ScriptManager.RegisterStartupScript(this, GetType(), "refresh", "window.setTimeout('window.location.reload(true);',5000);", true);

2

在您的中page_load,添加以下内容:

Response.CacheControl = "no-cache";
Response.AddHeader("Pragma", "no-cache");
Response.Expires = -1;

1
Response.Write("<script>window.opener.location.href = window.opener.location.href </script>");

1

您可以使用2种方法解决此问题:1)在head标签之后

<head> 
<meta http-equiv="refresh" content="600">
</head>

2)如果您的页面没有head标签,则必须使用Javascript来实现

<script type="text/javascript">
  function RefreshPage()
  {
    window.location.reload()
  }
</script>

我的联络人:

http://gola.vn


1

我可以执行页面刷新的唯一正确方法是通过JavaScript,许多顶级.NET回答对我来说都是失败的。

Response.Write("<script type='text/javascript'> setTimeout('location.reload(true); ', timeout);</script>");

将上面的代码放入按钮单击事件或您要强制刷新页面的任何位置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.