在回发后刷新时提示确认表单重新提交。我做错了什么?

时间:2011-09-08 18:42:07

标签: c# asp.net ajax postback

我有一个以空白/默认状态启动的仪表板。我让用户能够将已保存的状态加载到仪表板中。当他们点击“应用”按钮时,我运行以下代码:

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,因为我想在运行click事件之前执行验证。所以,现在,我执行客户端验证,然后允许点击按钮运行。

没有更新面板包装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);

2 个答案:

答案 0 :(得分:10)

当您刷新浏览器时,它将重新发送您上次提出的请求。如果它是一个POST请求(就像你在回发的情况下那样),那么它会重新发布信息,但在这之前你会看到你描述的警告信息。

避免此问题的最佳方法是实施模式Post/Redirect/Get

  

发布/重定向/获取(PRG)是Web开发人员的常见设计模式,可帮助避免某些重复的表单提交,并允许用户代理使用书签和刷新按钮更直观地表现。

通常人们不会实现这一点(尽管我们应该这样做),除非重新发布可能会导致某些数据不一致。

答案 1 :(得分:0)

当您刷新浏览器时,它将重新发送您上次提出的请求。如果它是一个POST请求(就像你回发那样),那么它会重新发布信息,但在这之前你会看到你描述的警告信息。