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

Sea*_*son 5 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));
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

Cla*_*edi 10

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

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

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

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