0

我在用:

Response.Redirect(Request.RawUrl);

在我的网页上强制回发。但是,代码中的执行路径就像是第一次加载页面一样。我如何引起普通的回发?

任何建议表示赞赏。

问候。

编辑:

这篇文章似乎吸引了很多负面情绪。在 Google 搜索强制发后,我从 Stock Overflow 帖子中获得了这种方法。因此,反对者可能应该在那个帖子而不是我的帖子上表达他们的挫败感。

为了澄清对我的问题的一些误解:

我有一个事件 Button_Click,其中包含方法主体中的逻辑——显然。然而,代码的执行流程是这样的:

Button_Click --> Page_Load (IsPostBack == true) --> Button_Click body --> 执行结束。

所以我的问题是 Button_Click 正文中的任何逻辑都没有显示在页面上,因为回发是在 Button_Click 正文中的任何代码执行之前完成的。

编辑:

这是事件:

protected void RedoEdits_Click(Object sender, EventArgs e)
{
    // Goes to Page_Load here with IsPostBack == true
    string trendsFileLocation = currDir + "\\" + reportDir + "\\" + trendsFile;
    string messagesFileLocation = currDir + "\\" + reportDir + "\\" + messagesFile;
    if (File.Exists(trendsFileLocation))
    {
        File.Delete(trendsFileLocation);
    }
    if (File.Exists(messagesFileLocation))
    {
        File.Delete(messagesFileLocation);
    }
    trendsXML.Clear();
    editMode = "redo";
}

IsPostBack == true 的代码片段:

if (editMode.Equals("redo"))
{
    editMode = "";
    ViewReport_Click(null, null);
}

代码片段永远不会被执行,因为回发首先发生,跳过片段,因为editMode!=重做,然后以RedoEdits_Click的主体结束,最终设置editMode ==重做,但由于回发已经发生,我们没有到达ViewReport_Click。

顺便说一句,editMode 是一个会话变量,因此它会持续存在。

4

4 回答 4

2

那是因为重定向确实会像第一次一样加载页面。它根本没有发回。这可能在像按钮单击这样的事件处理程序中,但是一旦您在该回发事件处理程序中重定向,它就不再在同一实例的回发中,您正在从头开始重新加载页面。

例子

private void MyButton_Click(Object sender, EventArgs e)
{
   lblStatus.Text = "Button Clicked!";  // still within a postback
   Response.Redirect(Request.RawUrl);  // now leaving the postback.  At this point, exexution stops and the page is loaded from scratch, as if we're not in a postback.

   lblStatus.Text = "Done posting back";  // This code will never execute.,  Response.Redirect throws a System.ThreadAbortException, and by default, code execution stops once Response.Redirect happens.

}

如果您想触发真正的回发而不从头开始加载页面,请在屏幕上放置一个按钮或一些控件并使用它来触发真正的回发,并且不要调用 Response.Redirect()。


由于下面的hte评论而添加:

熟悉ASP.NET 页面生命周期。如果您在 Page_Load 中发生了您不想在回发中发生的事情,那么您应该用

if(!Page.IsPostback)
{
  // stuff that should only happen on initial load here.
}

或者考虑在不同的事件中做这些事情。例如,如果您正在快速创建控件,则应在 Page_Init 中完成,因为它发生在应用 ViewState 之前。如果这样做,则在每次回发时在 Page_Init 中创建控件,然后从 Viewstate 应用值,然后到达 Page_Load,您可以在其中使用它们。

于 2012-07-04T16:17:23.957 回答
1

您不能从代码隐藏中强制回发。你会怎么做?例如,当您单击按钮时会发生回发。即使可以从代码隐藏中强制它(当然有办法),你会得到什么?只要调用一个你想要的方法,不要做这种愚蠢的事情。

回发 = 将数据/请求回发到同一页面。重定向显然是行不通的。

基于 OPs 编辑的编辑

您需要重新考虑您的工作流程,所以也许可以这样做:

protected void RedoEdits_Click(Object sender, EventArgs e)
{
    // Goes to Page_Load here with IsPostBack == true
    string trendsFileLocation = currDir + "\\" + reportDir + "\\" + trendsFile;
    string messagesFileLocation = currDir + "\\" + reportDir + "\\" + messagesFile;
    if (File.Exists(trendsFileLocation))
    {
        File.Delete(trendsFileLocation);
    }
    if (File.Exists(messagesFileLocation))
    {
        File.Delete(messagesFileLocation);
    }
    trendsXML.Clear();

    ViewReport_Click(null, null);
}

尝试模仿回发确实不是一个好主意。

或者,也许更好的方法 - 定义一个新事件,比如说 EditModeActive(或任何你想要的名称),每次你分配 editMode = "redo" 时都会启动它。然后只需订阅此活动并做任何您想做的事情。

于 2012-07-04T16:19:00.693 回答
0

我需要重新加载页面来恢复我原始的、未经编辑的 HTML。编辑表格的过程取代了一些 InnerHTML,我需要重新开始重新进行编辑。所以我只是移动了在 IsPostBack 的代码中重做编辑所需的逻辑!= true 并留在 Response.Redirect(Request.RawUrl)。奇迹般有效。

于 2012-07-05T15:25:36.747 回答
0

Response.Redirect() 不会导致任何回发,因为它只向服务器发送一个简单的 GET 请求。

于 2012-07-04T16:17:21.413 回答