Asp.Net防止重新整理重複提交資料的辦法

來源:互聯網
上載者:User

在網上搜 一下,可以找到很多關於這方面的資料,其中有一篇是來自MSDN上的一種解決方案: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/BedrockASPNET.asp 它是通過重新定義 System.Web.UI.Page 類來實現載入頁面時,是“重新整理”、“後退”請求,還是正常請求,其他的頁面則繼承了自訂的這 個Page類。感覺他這個方法比較獨特,有例子可以下載,有興趣的可以研究研究。

網上最多的解決此類問題的方法就是不儲存緩衝,即提交後表單上的資料不會被瀏覽器的緩衝儲存,如果此時再遇到重新整理或者後退請求時, 就會顯示“網頁已到期”,資料也就不會重複提交了,這就起到了阻止重新整理重複提交的效果。

下面以簡單的提交一篇文章為例,介紹禁用緩衝防止重新整理重複提交的方法,表單資料包括“標題”和“本文”兩個部分。

以下是該方法的代碼(post.aspx):

複製代碼 代碼如下://頁面載入

protected void Page_Load(object sender, EventArgs e)

{

//可以在頁面載入時設定頁面的緩衝為“SetNoStore()”,即無緩衝

Response.Cache.SetNoStore();

//Session中儲存的變數“IsSubmit”是標記是否提交成功的

if ((bool)Session["IsSubmit"])

{

//如果表單資料提交成功,就設“Session["IsSubmit"]”為false

Session["IsSubmit"] = false;

//顯示提交成功資訊

ShowMsg.Text = " * 提交成功!";

}

else

//否則的話(沒有提交,或者是頁面重新整理),不顯示任何資訊

ShowMsg.Text = "";

}

//提交按鈕(btnOK)單擊事件

protected void btnOK_Click(object sender, EventArgs e)

{

if (txtTitle.Text.ToString().Trim() == "")

//ShowMsg是用來顯示提示資訊的

ShowMsg.Text = " * 標題不可為空!";

else if (txtText.Text.ToString().Trim() == "")

ShowMsg.Text = " * 內容不可為空!";

else

{

//這裡是將資料提交到資料庫中,省略

/*

string sql = "insert into tab...values(...)";

MyConn.ExecQuery(sql);

*/

//提交成功後,設“Session["IsSubmit"]”為true

Session["IsSubmit"] = true;

//強制轉換頁面(不可少,否則重新整理仍會重複提交,仍轉到本頁),

通過頁面的轉換將緩衝中的提交的資料都釋放了,即提交的標單資料不會被儲存到緩衝裡,

如果後退的話,將會出現該頁無法顯示

Response.Redirect("post.aspx");

}

}

上面這個方法非常簡單也很實用,推薦大家使用。

下面是我自己研究出來的另一種方法,該方法不同於“不儲存緩衝的方法”,它是讓瀏覽器儲存所有頁面緩衝的。該方法通過隨機碼的方式 來判斷是正常提交還是“重新整理”或“後退”的。

首先(提交頁面是post.aspx)在 Session 中 增加變數 Rnd 用來存放隨機碼,同時在提交表單資料時不做處理,而是讓頁面轉到 post.aspx?r=x,這裡“x”等於Session["Rnd"],這個時候在頁面載入時,通過判斷r的值和Session["Rnd"]的值是否相同,如果相同就處理提 交的資料,否則即可認為是“重新整理”或者是“後退”操作了,最後再次付給Session["Rnd"]一個隨機碼。

以下是該方法代碼(post.aspx):

複製代碼 代碼如下://擷取隨機碼

public class MyRnd

{

public static string Rnd()

{

//隨機碼是由 0-9 a-z A-Z 之間的數字或字母組成的

//下面是產生的20位隨機碼

//0..9 A..Z a..z

//48-57 65-90 97-122

string rst = "";

Random rr = new Random();

for (int i = 0; i < 20; i++)

{

int ir = 0;

do

{

ir = rr.Next(123);

if((ir >= 48) && (ir <= 57)) break;

else if((ir >= 65) && (ir <= 90)) break;

else if ((ir >= 97) && (ir <= 122)) break;

}

while (true);

rst += ((char)ir).ToString();

}

return rst;

}

}

//頁面載入

protected void Page_Load(object sender, EventArgs e)

{

//擷取URL中請求的“r”值,如果“r”不存在則 r=""

string r = "";

if(Request.QueryString["r"] != null)

r = Request.QueryString["r"].ToString().Trim();

string t;

//擷取 “Session” 中的 “Rnd” 值,用於和“r”比較

t = Session["Rnd"].ToString().Trim();

//如果“r=t”則為提交操作,即可對錶單的資料進行處理

if(r == t)

{

if (txtTitle.Text.ToString().Trim() == "")

ShowMsg.Text = " * 標題不可為空!";

else if (txtText.Text.ToString().Trim() == "")

ShowMsg.Text = " * 內容不可為空!";

else {

//這裡是將資料提交到資料庫中,省略

/*

string sql = "insert into tab...values(...)";

MyConn.ExecQuery(sql);

*/

//提交成功後清空表單資料

txtTitle.Text = "";

txtText.Text = "";

//顯示提交成功資訊

ShowMsg.Text = " * 提交成功!";

}

}

//否則可以認為是“重新整理”或者“後退”操作

else

{

txtTitle.Text = "";

txtText.Text = "";

}

//最後要重新獲得“Session["Rnd"]”的值,並將“btnOK.PostBackUrl”設為“Session["Rnd"]”的值

Session["Rnd"] = MyRnd.Rnd();

btnOK.PostBackUrl ="post.aspx?r=" + Session["Rnd"].ToString().Trim();

}

//這裡提交按鈕(btnOK)單擊事件就不需要寫任何代碼了

通過這種方法,每次載入頁面時“Session["Rnd"]”都將得到一個新的值,而在重新整理或後退時就不會得到相同的“r”和“t”值,資料也就 不會被重複提交,只有通過“btnOK”來提交的操作才會得到“r==t”,資料才會被提交處理的,通過判斷隨機碼的方式來阻止重新整理重複提交就 可以實現了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.