我有一个带有Form元素(<form runat="server">
)的母版页,一个带有Button元素(<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Sync" />
)的内容页面,以及一个包含Button1_Click
函数的Code Behind页面。
用户进入该页面并单击该按钮。 Code Behind代码执行(在服务器上),在其中更新数据库中的某些表。代码隐藏代码的最后一件事是在内容页面上设置Span元素的InnerHTML
,并显示成功或失败消息。
一切都很好。问题是如果用户刷新页面,则重新提交表单,浏览器会询问是否真的是用户想要的。如果用户回答是肯定的,则重新执行Code Behind代码并再次更新数据库。如果用户反应消极,则没有任何反应。
重新执行代码背后的代码并不是什么大问题。它不会伤害任何东西。但这并不是我想要的行为。
我知道我可以使用Response.Redirect()重定向回页面,但用户永远不会看到我的成功或失败消息。我应该提一下,消息实际上不仅仅是“成功”或“失败”,否则我想我可以在重定向上的QueryString中添加一些内容。
有没有办法从Code Behind代码重置Form元素,以便在用户刷新页面时不重新提交Form?
母版页......
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="IntuitSync.SiteMaster" %>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" xmlns:ipp="">
<head runat="server">
</head>
<body>
<form runat="server">
<div runat="server" id="mainContetntDiv">
<asp:ContentPlaceHolder ID="MainContent" runat="server" />
</div>
</form>
</body>
</html>
内容......
<%@ Page Language="C#" AutoEventWireup="true" MasterPageFile="~/Site.master" CodeBehind="SyncToCloud.aspx.cs" Inherits="IntuitSync.SyncToCloud" %>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Sync" />
<span runat="server" id="SyncStatus"></span>
</asp:Content>
背后的守则......
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Globalization;
using System.Web;
namespace IntuitSync
{
public partial class SyncToCloud : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//
}
protected void Button1_Click(object sender, EventArgs e)
{
/*
Do a bunch of stuff and put the results in syncResults which is a List.
*/
SyncStatus.InnerHtml = string.Join("", syncResults.ToArray()); // I'd rather do this...
//Response.Redirect(Request.Url.PathAndQuery, true); // ...and not do this.
}
}
}
非常感谢任何和所有帮助。
答案 0 :(得分:7)
问题是你正在进行一个表单POST,如果用户随后刷新页面,它会做它应该做的事情:重新提交POST。没有其他办法了。因此,您可以选择的选项如下:
注意:确保您清理任何和所有用户输入(始终将用户输入视为邪恶)。
你可能会对最后一个选项感到最开心,但这完全取决于“做一堆事情并将结果放在syncResults中......”真的需要。
更新(多年后)
虽然显而易见,但某些用户可能不够明显:你不应该通过直接通过查询字符串参数显示未经过消毒的“成功消息”来打开自己的XSS攻击。这些建议认为这是显而易见的,但回想起来,在这方面应该已经明确说明了。
答案 1 :(得分:1)
我建议进入JASON路线
在SyncToCloud.aspx.cs上
[System.Web.Services.WebMethod]
public static string updateSyncStatus()
{
/*
Do a bunch of stuff and put the results in syncResults which is a List.
*/
SyncStatus.InnerHtml = string.Join("", syncResults.ToArray()); // I'd rather do this...
//Response.Redirect(Request.Url.PathAndQuery, true); // ...and not do this.
}
在SyncToCloud.aspx上
function SyncStatus(){
$.ajax({
type: "POST",
async:true,
url: "syncToCloud.aspx/updateSyncStatus",
data: <if have anydata>,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
if (msg.d == "Success") {
//Set message on some lable or do something
} else {
//Proceed to show message on wrong password
}
}
});
}
buutton上的标记
<asp:Button ID="Button1" runat="server" OnClientClick="SyncStatus(); return false;" Text="Sync" />