回复导致页面加载,就像第一次一样

时间:2012-07-04 16:15:06

标签: c# asp.net postback

我正在使用:

Response.Redirect(Request.RawUrl);

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

感谢任何建议。

问候。

编辑:

这篇文章似乎吸引了很多消极性。在Google搜索强制回发后,我从Stock Overflow帖子中获得了此方法。因此,挫折者应该在那个帖子上取消他们的挫折而不是我的。

澄清一些关于我的问题的误解:

我有一个事件Button_Click,其中包含方法体中的逻辑 - 显然。但是代码的执行流程如下:

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

所以我的问题是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 个答案:

答案 0 :(得分:2)

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

实施例

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()。


由于下面的评论而添加:

熟悉ASP.NET Page Lifecycle。如果你在Page_Load中发生了你不希望在回发中发生的事情,那么你应该用

包围它们。
if(!Page.IsPostback)
{
  // stuff that should only happen on initial load here.
}

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

答案 1 :(得分:1)

您无法强制从代码隐藏中进行回发。你会怎么做?例如,单击按钮时会发生回发。即使有可能强制它从代码隐藏(肯定有一种方法),你会实现什么?只需调用你想要的方法,不要做这样的蠢事。

回发=将数据/请求发布回同一页面。重定向显然不起作用。

编辑基于OP编辑:

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

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”时都会启动。然后只需订阅此活动并按照您的意愿行事。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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