刷新后提示重新提交表单,在postback之后。我做错了什么?

5

我有一个仪表板,起始状态是空白/默认状态。我希望用户能够将已保存的状态加载到仪表板中。当他们点击'应用'按钮时,我会运行以下代码:

function CloseAndSave() {
    var radUpload = $find(radUpload1ID);
    var inputs = radUpload.getFileInputs();

    if (inputs[0].value.length == 0) {
        alert('Please select a dashboard to upload.');
        return;
    }

    if( !radUpload.isExtensionValid(inputs[0].value) ) {
        alert('Please select an XML file.');
        radUpload.clearFileInputAt(0);
        return;
    }

    oWindow = null;
    __doPostBack(radButton1ID);
}

protected void RadButton1_Click(object sender, EventArgs e)
{
    if (RadUpload1.UploadedFiles.Count > 0)
    {
        UploadedFile dashboardXMLFile = RadUpload1.UploadedFiles[0];

        SerializableDictionary<string, string> dataToLoad = new SerializableDictionary<string, string>();
        XmlSerializer xmlSerializer = new XmlSerializer(dataToLoad.GetType());

        using (StreamReader reader = new StreamReader(dashboardXMLFile.InputStream))
        {
            dataToLoad = (SerializableDictionary<string, string>)xmlSerializer.Deserialize(reader);
        }

        foreach (var entry in dataToLoad)
        {
            string sessionKey = entry.Key;

            if (!string.IsNullOrEmpty(entry.Value))
            {
                Type type = StateManager.GetTypeFromStateName(sessionKey);

                byte[] data = Convert.FromBase64String(entry.Value);
                using (MemoryStream memoryStream = new MemoryStream(data))
                {
                    xmlSerializer = new XmlSerializer(type);
                    SessionRepository.Instance.SetSession(sessionKey, xmlSerializer.Deserialize(memoryStream));
                }
            }
        }
    }
}

RadButton1的属性“AutoPostBack”被设置为false。我将AutoPostBack设置为false是因为我想在运行点击事件之前执行验证。所以,现在,我执行客户端验证,然后允许按钮点击运行。

没有更新面板包装RadButton1。因此,在RadButton1_Click后整个页面都会提交。这会导致页面状态“加载”分析状态。

此时,如果我刷新页面,Google Chrome会显示“请确认表单重新提交”。我已经阅读了如何消除它的方法,但我更愿意找出根本原因。

解决方案:

//This changes the response to a GET instead of a POST. Prevents the 'Form Resubmission' dialog.
Page.Response.Redirect(Page.Request.Url.ToString(), true);

每当通过表单提交页面时,用浏览器按钮(F5或其他)刷新页面将(应该)提示您。这是正常行为。您必须压制它,因为根本原因是普通浏览器行为,旨在防止意外重新提交实际执行某些操作(如提交付款)的表单。 - Nikki9696
我认为如果这些数据默默地重新提交,会发生糟糕的事情。我需要找到一种方法在它发生后清除POST数据。我正在阅读有关PRG的内容。 - Sean Anderson
2个回答

10
当你刷新浏览器时,它会重新发送上次的请求。如果这是一个POST请求(比如在postback的情况下),那么它将重新提交信息,但在此之前,你会看到你所描述的警告消息。
避免这个问题的最好方法是实现Post/Redirect/Get模式。
Post/Redirect/Get(PRG)是Web开发人员常用的设计模式,帮助避免某些重复的表单提交,并允许用户代理更直观地处理书签和刷新按钮。
通常人们不会实现这个模式(尽管我们应该这样做),除非重新提交可能导致一些数据不一致。

嗨,我读了一些关于这个的资料,但是我不确定如何实现它。你知道有没有任何ASP.NET AJAX的相关示例吗?我已经搜索了一些,但大多数都是概念性的讨论。我想在PageRequestManager的OnResponseEnd事件中进行操作,并在检测到正确条件时重定向到页面。这听起来合理吗? - Sean Anderson
我将此标记为答案,以表彰您提供的有价值的信息,但我已经将讨论移至新帖子中,以获取更多信息。谢谢! - Sean Anderson
@Sean Anderson:我有点困惑。也许我没有很好地理解你的想法。你说RadButton1提交整个页面而不使用AJAX,所以我不确定为什么你要尝试涉及PageRequestManager,如果请求没有涉及任何ajax交互。 - Claudio Redi
嘿,我也有点困惑。 :) 最终我根本没有走这条路。我所做的是在RadButton1_Click事件结束时加入了"Page.Response.Redirect(Page.Request.Url.ToString(), true);",这会在事件完成后重新加载页面--将其更改为get而不是post。 - Sean Anderson

0

当您刷新浏览器时,它会重新发送您上次的请求。如果它是一个POST请求(就像在postback的情况下一样),那么它将重新发布信息,但在执行此操作之前,您将看到您所描述的警告消息。


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