我有一个将文件保存在数据库中的代码。我的代码背后有这个功能:
protected void AttachFile(object sender, EventArgs e)
{
if (txtFile.HasFile)
{
string filename = Path.GetFileName(txtFile.PostedFile.FileName);
string contentType = txtFile.PostedFile.ContentType;
using (Stream fs = txtFile.PostedFile.InputStream)
{
using (BinaryReader br = new BinaryReader(fs))
{
Random ran = new Random();
byte[] bytes = br.ReadBytes((Int32)fs.Length);
NewRequestService newrequest = new NewRequestService();
string temp_id = "";
temp_id = ran.Next(100000, 999999).ToString();
saveAttachFile(filename, contentType, bytes, temp_id);
hdnAttachID.Value = temp_id;
lblAttach.InnerHtml = msg;
}
}
}
else { lblAttach.InnerHtml = "\"Please browse the file to attach.\""; }
}
这是我的HTML:
<asp:Button ID="btnAttached" runat="server" Text="Attach File" OnClick="AttachFile" />
<asp:FileUpload ID="txtFile" size="46" runat="server" />
只需单击"Attach File"
按钮,它将调用函数后面的代码并保存用户浏览的文件。它运行得很好,但是当我刷新页面时,它再次转到该函数并重复以记录副本结束的保存过程。我该如何避免这种情况发生?
我试过的一些是:
if (!IsPostBack) {}
条件。onClientClick="return false"
属性。但它没有解决问题。提前谢谢。
答案 0 :(得分:1)
使用此技术可以在刷新后阻止控制事件的双触发:
将此代码添加到页面PreRender
事件
protected void Page_PreRender(object sender, EventArgs e)
{
ViewState["CheckRefresh"] = Session["CheckRefresh"];
}
在Page_Load
活动中添加此行。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Session["CheckRefresh"] = Server.UrlDecode(System.DateTime.Now.ToString());
// rest of your code here ...
}
}
在您的控件事件上,例如您的按钮单击或任何其他您希望阻止此页面刷新的控件,请首先检查这些条件。
protected void AttachFile(object sender, EventArgs e)
{
if (Session["CheckRefresh"].ToString() == ViewState["CheckRefresh"].ToString())
{
// your code starts here ..
if (txtFile.HasFile)
{
//...
}
// your code ends here ..
Session["CheckRefresh"] = Server.UrlDecode(System.DateTime.Now.ToString());
}
}
干杯
答案 1 :(得分:0)
您可以使用Post/Redirect/Get (PRG)模式来克服此问题。你可以在这里看到类似的问题。 how to prevent data from sending if user press F5 or refresh in asp.net?