我正在使用:
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是一个会话变量,因此它会持续存在。
答案 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)。像魅力一样。