我有一个以空白/默认状态启动的仪表板。我让用户能够将已保存的状态加载到仪表板中。当他们点击“应用”按钮时,我运行以下代码:
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);
答案 0 :(得分:10)
当您刷新浏览器时,它将重新发送您上次提出的请求。如果它是一个POST请求(就像你在回发的情况下那样),那么它会重新发布信息,但在这之前你会看到你描述的警告信息。
避免此问题的最佳方法是实施模式Post/Redirect/Get
发布/重定向/获取(PRG)是Web开发人员的常见设计模式,可帮助避免某些重复的表单提交,并允许用户代理使用书签和刷新按钮更直观地表现。
通常人们不会实现这一点(尽管我们应该这样做),除非重新发布可能会导致某些数据不一致。
答案 1 :(得分:0)
当您刷新浏览器时,它将重新发送您上次提出的请求。如果它是一个POST请求(就像你回发那样),那么它会重新发布信息,但在这之前你会看到你描述的警告信息。