Programação em ASP.net
PostBacks, Round Trips A web é inerentemente desconectada O browser e o servidor estão conectados apenas durante o tempo necessário para processar o pedido Quando se faz um pedido de uma página.aspx o código da página é executado no servidor A cada pedido a página chama-se a si mesma de modo a executar o código outra vez. Como a página executa no servidor cada acção implica uma ida ao servidor. O pedido de uma página implica no servidor uma nova instância da página 1
Ciclo de processamento da página Round Trip O utilizador solicita a página. (A página é solicitada usando um método HTTP - GET). A página é executada pela primeira vez, executando processamentos preliminares se tiverem sido programados A página dinamicamente produz HTML para o navegador, semelhante a qualquer outra página HTML O utilizador interage com a página e submete a informação clicando num botão. A página é enviada para o servidor Web. ( O navegador executa um método HTTP - POST, que no ASP.NET é conhecido como um postback). Especificamente, a página é remetida de volta a si mesma. No servidor Web, a página executa novamente. As informações que o utilizador introduziu estão disponíveis para o código da página. A página executa o processamento que estiver programado. A página dinamicamente produz HTML para o navegador, semelhante a qualquer outra página HTML 2
Transferir informação (post) para outra página Usando hyperlinks na página Redireccionar programaticamente forçando o browser a pedir outra página Método Redirect -Response.Redirect(string url, ) Equivalente a um hyperlinks Comando HTTP GET Informação transferida pela QueryString Redireccionar programáticamente transferindo o control para outra página na mesma aplicação Web Método Server.Transfer Comando HTTP POST Permite à página destino ler valores dos controlos e propriedades públicas da página inicial 3
Cross-Page Configurar Cross-Page o que permite especificar outra página quando se faz post da corrente Cross-Page é a possibilidade de enviar informação para outras páginas Na página destino pode-se aceder às propriedades publicas da inicial e aos valores dos controlos. Definir nas propriedades do botão de submit a página destino PostBackUrl -> TargetPage.aspx 4
Cross-Page (cont.) 1- Aceder à informação - Controlos Propriedade Page.PreviousPage Método FindControl if (Page.PreviousPage!= null) { TextBox SourceTextBox = (TextBox)Page.PreviousPage.FindControl( tbox1"); if (SourceTextBox!= null) { Label1.Text = SourceTextBox.Text; } } 5
2 - Aceder à informação - Propriedades Definir propriedade publica na página inicial public string Cidade{ get { return ddlcidade.selecteditem.text; }} Definir uma referência na página destino para a página inicial <%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %> Na página destino aceder à propriedade Label1.Text = PreviousPage.Cidade; 6
Links no MSDN: Cross-Page Posting in ASP.NET Web Pages http://msdn2.microsoft.com/en-us/library/ms178139(vs.80).aspx Redirecting Users to Another Page http://msdn2.microsoft.com/en-us/library/x3x8t37x.aspx How to: Pass Values Between ASP.NET Web Pages http://msdn2.microsoft.com/en-us/library/6c3yckfw.aspx 7
Ciclo de vida da página
Ciclo de vida da página Modelo de compilação e classes parciais Uma Web Form deriva da classe System.Web.UI.Page Dois componentes: Code behind file- xxx.aspx.cs - contém o código para os eventos e outros métodos relacionados com a página Public parcial class _Default protected void Page_Load(object sender, EventArgs e) {if (!Page.IsPostBack) Designer file xxx.aspx que contém declarações de controlos HTML e eventos. <asp:radiobuttonlist ID="rbl" runat="server" AutoPostBack="True" OnSelectedIndexChanged="rbl_SelectedIndexChanged"> 9
Ciclo de vida da página Ciclo de vida da página Para cada pedido a página é instanciada de novo, perdendo todos os valores e estado anterior Para manter a informação no servidor tem de se usar um mecanismo de gestão de estado: Application, Session, Variáveis de Cache ou Cookies. A classe Page implementa o método ProcessRequest da interface IHttpHandler, responsável por todas as fases do ciclo de vida da página Durante a execução da página são lançados vários eventos. 10
Sequência de Eventos Sequência de Eventos 1 PreInit Todos os controlos criados no design são inicializados com os seus valores por omissão. Neste evento podem ser criados controlos dinâmicos. Pode-se fazer override do método. protected override void OnPreInit(EventArgs e) { //custom code base.onpreinit(e); } Permite a definição dinâmica da Master Page e do theme aplicado à página. 11
Sequência de Eventos 2 Init Os controlos da página são inicializados e a propriedade UniqueID de cada controlo é definida. Os skin são aplicados aos controlos. O ViewState dos controlos ainda não está disponível. 3 InitComplete Apenas ocorre quando é um postback e consiste na recuperação do estado interno da página através dos dados guardados no Viewstate e no ControlState. O estado interno dos controlos é actualizado com os dados provenientes do formulário enviado HTTP Post Data 4 Load Podem ser criados controlos dinâmicos e definidas propriedades dos controlos. O métod IsPostBack permite verificar se é um postback 12
Sequência de Eventos 4 Load (cont) São gerados os eventos servidores dos controlos. Por exemplo, o evento Click gerado pelo controlo Button. 5 PreRender Começa a fase de geração do HTML da página. É o ultimo evento onde se pode alterar o valor dos controlos. 6 SaveViewState, SaveControlState A página inicia o armazenamento dos dados internos mantidos por todos os controlos. Os dados são guardados num HTML input escondido <input type="hidden" name=" VIEWSTATE" id=" VIEWSTATE" value="/wepdwukmtk3mdmwmzewna. 13
Sequência de Eventos 6 - Render É gerado o HTML para todos os controlos existentes na árvore de controlos da página. O evento RenderControl é chamado recursivamente para todos os controlos. 7 UnLoad Permite efectuar a limpeza de eventuais recursos usados durante o processamento Links [ASP.NET Page Life Cycle] http://msdn2.microsoft.com/en-us/library/ms178472.aspx [ASP.NET Page Lifecycle] http://www.codeproject.com/useritems/lifecycle.asp http://codebetter.com/blogs/raymond.lewallen/archive/2005/03/10/59583.aspx 14
Eventos Exemplo de override de um evento A master page é embebida com a página no evento PreInit. A alteração do conteúdo ou substituição da master page deve ser realizada nesse evento protected override void OnPreInit(EventArgs e) { base.onpreinit(e); //criar variáveis com o controlo da master Label lb = (Label)Page.Master.FindControl("LabelMaster"); lb.text = Texto alterado"; // pode tambem alterar a master page //Page.MasterPageFile = "~/MasterPage2.master"; } 15
Server Control Event Model Os eventos associados aos server control são originados nos clientes mas processados no servidor protected void Bt_Click(object sender, EventArgs e) { // código de processamento do evento } Asp.net captura o evento, transmite e interpreta o evento Apenas alguns eventos geram chamada ao servidor Button -> Click, Calendar -> SelectionChanged Para outros eventos é necessário AutoPostBack=true; CheckBox -> CheckedChange Server control não suportam eventos com grande ocorrência OnMouseOver, OnMouseOut 16
Argumentos dos eventos protected void Bt_Click(object sender, EventArgs e) Object sender Objecto que provocou o evento EventArgs e Objecto evento que contém informação específica sobre o evento Exemplo para um button CommandEventArgs e Propriedades: CommandName, CommandArgument protected void btsubmit_command (object sender, CommandEventArgs e) 17
<h3>button CommandName Example</h3> Click on one of the command buttons. <br><br> <asp:button id="button1" Text="Sort Ascending" CommandName="Sort" CommandArgument="Ascending" OnCommand="CommandBtn_Click" runat="server"/> <asp:button id="button2" Text="Sort Descending" CommandName="Sort" CommandArgument="Descending" OnCommand="CommandBtn_Click" runat="server"/> <br><br> 18
void CommandBtn_Click(Object sender, CommandEventArgs e) { switch(e.commandname) { case "Sort": // Call the method to sort the list. Sort_List((String)e.CommandArgument); break; case "Submit": // Display a message for the Submit button being clicked. Message.Text = "You clicked the Submit button"; // Test whether the command argument is an empty string (""). if((string)e.commandargument == "") [http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.commandeventargs(vs.80).aspx] 19
GridViewRowEventArgs RowCreated - método ocorre quando é criada uma row na gridview protected void GridDatalhesFactura_RowCreated(object sender, GridViewRowEventArgs e) { // torna invisiveis colunas da grelha e.row.cells[0].visible = false; e.row.cells[2].visible = false; e.row.cells[3].visible = false; } 20
Criação dinâmica de controlos protected String[] links= {"http://www.sapo.pt","http://www.tsf.pt"}; foreach (String str in links) { HyperLink hl = new HyperLink(); hl.text = str; hl.navigateurl = str; PanelLinks.Controls.Add(hl); LiteralControl lc = newliteralcontrol("<br>"); PanelLinks.Controls.Add(lc); } 21
Criação dinamica de uma tabela int n = 5; int k = 0; Table ta = new Table(); for (int i = 0; i < n; i++) { TableRow tr = new TableRow(); for (int j = 0; j < n; j++) { TableCell tc = new TableCell(); tc.text = k.tostring(); tr.cells.add(tc); k++; } ta.rows.add(tr); } Panel1.Controls.Add(ta); } 22
Trace Trace Permite detectar erros na página e ver os vários eventos que ocorrem na página Document -> Properties - > Trace = true Informação gerada: Trace Information Control Tree Session state Aplication state Request Cookie Collection Response cookie Collection Headers Collection Response headers collection Form Collection QueryString Collection Server variables 23
Trace Inserir Informação no Trace Trace.Warn("debugging", "Radio Button SelectedIndexChanged "); Excerto da Informação de trace aspx.page aspx.page aspx.page aspx.page aspx.page aspx.page aspx.page aspx.page debugging aspx.page End ProcessPostData Begin PreLoad End PreLoad Begin Load End Load Begin ProcessPostData Second Try End ProcessPostData Second Try Begin Raise ChangedEvents Radio Button SelectedIndexChanged End Raise ChangedEvents 24
Trace O trace pode ser ligado para toda a aplicação sendo mostrada a informação noutra página Link MSDN [Walkthrough: Using Tracing in Visual Web Developer to Help Find Web Page Errors] http://msdn2.microsoft.com/en-us/library/yc8h9b0b(vs.80).aspx 25