Fonte: www.activedelphi.com.br
Olá todos! Segue aqui uma dica para o pessoal que desenvolve para .net com delphi (BDS 2006). Como demorei para encontrar essa solução, resolvi compartilhá-la para ajudar os demais usuários de delphi.net
O problema é o seguinte: desenvolvi uma página em asp.net web forms do delphi que faz insert em um banco de dados SQL Server. Tudo funcionou OK, porém quando o usuário clicava no refresh do browser, este executava o último request feito ao servidor web e, se no caso fosse um insert por exemplo, ele efetuava o insert dinovo, ou seja. "PAU" rsrs !!! Desenvolvi uma solução simples implementando o evento page_prerender e page_load do lado do servidor.
Observação: a procedure Page_PreRender(sender: System.Object; e: System.EventArgs); não é iniciada pelo delphi quando vc cria um novo asp.net web form, portanto, sua declaração, implementação e inicialização tem que ser feita manualmente.
Segue abaixo o código:
unit WebForm1;
interface
uses
System.Collections, System.ComponentModel,
System.Data, System.Drawing, System.Web, System.Web.SessionState,
System.Web.UI, System.Web.UI.WebControls, System.Web.UI.HtmlControls;
type
TWebForm1 = class(System.Web.UI.Page)
{$REGION 'Designer Managed Code'}
strict private
procedure InitializeComponent;
procedure Button1_Click(sender: System.Object; e: System.EventArgs);
{$ENDREGION}
strict private
procedure Page_Load(sender: System.Object; e: System.EventArgs);
procedure Page_PreRender(sender: System.Object; e: System.EventArgs);
strict protected
Button1: System.Web.UI.WebControls.Button;
TextBox1: System.Web.UI.WebControls.TextBox;
procedure OnInit(e: EventArgs); override;
private
{ Private Declarations }
public
{ Public Declarations }
end;
implementation
{$REGION 'Designer Managed Code'}
///
O problema é o seguinte: desenvolvi uma página em asp.net web forms do delphi que faz insert em um banco de dados SQL Server. Tudo funcionou OK, porém quando o usuário clicava no refresh do browser, este executava o último request feito ao servidor web e, se no caso fosse um insert por exemplo, ele efetuava o insert dinovo, ou seja. "PAU" rsrs !!! Desenvolvi uma solução simples implementando o evento page_prerender e page_load do lado do servidor.
Observação: a procedure Page_PreRender(sender: System.Object; e: System.EventArgs); não é iniciada pelo delphi quando vc cria um novo asp.net web form, portanto, sua declaração, implementação e inicialização tem que ser feita manualmente.
Segue abaixo o código:
unit WebForm1;
interface
uses
System.Collections, System.ComponentModel,
System.Data, System.Drawing, System.Web, System.Web.SessionState,
System.Web.UI, System.Web.UI.WebControls, System.Web.UI.HtmlControls;
type
TWebForm1 = class(System.Web.UI.Page)
{$REGION 'Designer Managed Code'}
strict private
procedure InitializeComponent;
procedure Button1_Click(sender: System.Object; e: System.EventArgs);
{$ENDREGION}
strict private
procedure Page_Load(sender: System.Object; e: System.EventArgs);
procedure Page_PreRender(sender: System.Object; e: System.EventArgs);
strict protected
Button1: System.Web.UI.WebControls.Button;
TextBox1: System.Web.UI.WebControls.TextBox;
procedure OnInit(e: EventArgs); override;
private
{ Private Declarations }
public
{ Public Declarations }
end;
implementation
{$REGION 'Designer Managed Code'}
///
/// Required method for Designer support -- do not modify
/// the contents of this method with the code editor.
/// By Reinaldo Holanda Carlos
/// Diferenciar postback de um controle em relação ao refresh ... para que o refresh não execute
/// o último request repetidamente , isso pode evitar erros pois se o seu último request foi um insert
/// ele vai executar de novo esse insert clicando no refresh do browser ou com a tecla f5
/// com esse código identifico quando é um postback de um controle e quando é um postback do refresh do browser.
///
procedure TWebForm1.InitializeComponent;
begin
Include(Self.Button1.Click, Self.Button1_Click);
Include(Self.Load, Self.Page_Load);
include(self.PreRender, self.Page_PreRender);
end;
{$ENDREGION}
procedure TWebForm1.Page_Load(sender: System.Object; e: System.EventArgs);
begin
// TODO: Put user code to initialize the page here
if not (IsPostBack) then //na primeira vez coloca data
begin
Session['CheckRefresh'] := Server.UrlDecode(System.DateTime.Now.ToString());
end;
end;
procedure TWebForm1.Page_PreRender(sender: TObject; e: System.EventArgs);
begin
ViewState['CheckRefresh'] := Session['CheckRefresh'];
end;
procedure TWebForm1.OnInit(e: EventArgs);
begin
//
// Required for Designer support
//
InitializeComponent;
inherited OnInit(e);
end;
procedure TWebForm1.Button1_Click(sender: System.Object; e: System.EventArgs);
begin
if (Session['CheckRefresh'].ToString() =
ViewState['CheckRefresh'].ToString()) then
begin
Response.Write('
Request disparado por um CONTROLE
>'+'');
Response.Write(Session['CheckRefresh'].ToString()+' - '+ViewState['CheckRefresh'].ToString());
Session['CheckRefresh'] := Server.UrlDecode(System.DateTime.Now.ToString());
end
else
begin
Response.Write('
Request disparado por um refresh do Browser: ' + request.Browser.Browser + '
');
Response.Write(Session['CheckRefresh'].ToString()+' - '+ViewState['CheckRefresh'].ToString());
end;
end;
end.
Nenhum comentário:
Postar um comentário