Não submeta seu Formulários Ajax Them

Tseu artigo centra-se tanto em resolver o problema de envio de dados usando HTTP POST, e na definição de um estado que está associado com uma página HTML. Este artigo aborda os seguintes tópicos:

• Explicação dos problemas associados com HTTP POSTs

• Como corrigir os problemas relacionados ao HTTP POSTs

• Ilustração de uma arquitetura de fluxo de trabalho

  

• Associação de Estado com um manipulador

Problema Você quer usar Ajax para resolver alguns dos problemas associados ao envio de formulários da forma tradicional com POST.

Teoria

Solução Frameworks de aplicação Web têm ido para grandes extensões de resolver o problema HTTP POST. Você precisa olhar mais longe do que a estrutura do ASP.NET para ver a complexidade envolvida em se certificar que a parte traseira do navegador ou botões Refresh não causam uma montanha de problemas com relação ao servidor de estado do lado. ASP.NET não deve ser responsabilizado, pois seus criadores estavam tentando encaixar uma arquitetura dinâmica em uma infra-estrutura web velho estático. A soma seguintes pontos a vantagem de usar essa abordagem:

• Os dados são enviados para o servidor apenas uma vez, e somente se o usuário pressionar o botão Enviar formulário.

• As lojas do lado do servidor um estado do aplicativo que você pode usar HTTP GET para chamar sempre que uma página HTML especial é chamado. Portanto, você pode usar os botões Voltar Browser e Navegador Forth para mover entre as páginas sem corromper página HTML o servidor de estado do lado ou do lado do cliente.

Convertendo o POST Usar a XMLHttpRequest Objeto

A solução para o problema POST HTTP é simples, mas requer a habilidade de usar o objeto XMLHttpRequest. Nesta seção, você vai aprender como converter o pedido inicial para utilizar a nova arquitetura. As páginas originais e novos HTML será ilustrado com um nível de código. A idéia desta seção é ilustrar a conversão.

The Original de formulário HTML

O formulário HTML original usado um POST HTTP, e é ilustrado como segue:

 Título 
action = "/ artigos ajaxrest / Arquitectura / forms / Posted.ashx" method = "POST">

Os atributos de forma ousada mostram que quando o botão Enviar é pressionado, o URL / artigos ajaxrest / Arquitectura / forms / Posted.ashx é chamado usando um POST. De um Representational State Transfer (REST) perspectiva, a URL só aceita um único verbo, o POST. Este é o cerne do problema em que você não pode recuperar a página usando um GET, que é o padrão verbo HTTP usado por um navegador.

A conversão de formulário HTML

O formulário HTML convertido usa o HTML mesmo constrói, mas delega o POST para um XMLHttpRequest e recupera a próxima página usando um GET. O código a seguir mostra o formulário HTML convertido:

 Título 
   
   
type = "botão" value = "Submit" onclick = "onSubmit ()"/>

As partes importantes modificada da página HTML são exibidas em negrito. A mudança geral tem sido a de converter o tipo de entrada de apresentar ao botão, e tem o botão de implementar o evento clique. O evento, clique OnSubmit chamadas e é responsável por fazer um GET e POST. OnSubmit Quando é chamado, a função RepresentationManager.iterateHTML.get é chamado, que é utilizado para extrair o estado dos elementos de formulário HTML. Normalmente, quando se utiliza o formulário HTML anterior, apresentar a técnica, o navegador gere a extração do estado a partir do formulário HTML. É mais complicado para realizar uma extração de costume, mas dá a vantagem de ser capaz de extrair o estado de outros elementos HTML, como elementos div ou span. Você precisa pensar de um GET chamada de método como um estado geral de extracção que é atribuído a um objeto JavaScript.

Quando o objeto de JavaScript que contém o estado foi criado, você precisa converter o objeto em uma interface gráfica do computador (CGI)-codificado seqüência de consulta. A função Ops.serializeCGI realiza a conversão. Novamente, você precisa executar uma serialização personalizada, mas você tem a flexibilidade de serialização para um CGI-string codificada, uma persistiu JavaScript Object Notation (JSON), ou mesmo uma string XML. Então, quando você tem a seqüência de consulta CGI, você usa o código restante no OnSubmit para lançar os dados para o servidor. Observe que o URL do POST é utilizado a partir do formulário HTML. Uma vez que o cargo foi preenchido na implementação do método onComplete, o location.href é atribuído a URL que foi colocada.

Aqui é onde você pode ficar confusa. Porque primeiro post e então, fazer a mesma URL? Pode parecer mais eficiente para realizar um único post ou GET. A razão para a execução dos dois verbos é devido ao histórico do navegador. O POST é executado pelo objeto XMLHttpRequest, não fazendo parte do histórico do navegador. O POST é usado para criar um estado no servidor, e então o browser executa o GET, para que a página está registrado no histórico do navegador. Como resultado, o navegador tem dois GETs na história, ao invés de um GET e POST, como foi o caso no exemplo original formulário HTML. Quando você tem dois GETs na história, você não precisa enviar para o servidor estatal, como o estado é recuperado. O cliente ainda convida o mesmo URL, mas a funcionalidade do URL do servidor foi alterado. No exemplo a vez de formulário HTML, o servidor tem de reagir a um poste e um GET. No entanto, o servidor deve associar um estado com o pedido, que não era necessário no caso do formulário HTML original. No formulário HTML original, o estado foi gerado com cada post. Associando um estado com o pedido que não é difícil e requer apenas o uso do aplicativo da Web fornecido pelo mecanismo de sessão. Você tem que mudar o código do servidor para que as informações geradas pelo POST é armazenado na sessão e recuperados quando o GET é chamado. O código a seguir mostra uma aplicação extremamente simples do código serverside original:

public void ProcessRequest (HttpContext ctx) (ctx.Response.ContentType = "text / html"; ctx.Response.Write ( "  Você escreveu "+ ctx.Request [" exemplo "] +"  ");) Aqui está o código do servidor modificados: public void ProcessRequest (HttpContext ctx) (ctx.Response.ContentType =" text / html "if (ctx.Request.HttpMethod ==" POST ") (ctx.Session.Add ( "exemplo", ctx.Request [ "exemplo"]); ctx.Response.Write ( "  Você escreveu "+ ctx.Request [" exemplo "] +"  ");) Else if (ctx.Request.HttpMethod ==" GET ") (ctx.Response.Write ("  Você escreveu "+ ctx.Session [" exemplo "] +"  ");))

O exemplo é codificada usando o ASP.NET, mas mesmo se você não for um programador ASP.NET, você deve ser capaz de seguir a explicação. Na implementação original do ProcessRequest, esperava-se que você chamar o método usando um POST. Para gerar o conteúdo, você extrai a variável ctx.Request exemplo usando o método. Como a aplicação original do ProcessRequest está definido, não há memória de ter sido chamado anteriormente. A saída gerada é dependente dos parâmetros enviados no POST. O código original é considerado inseguro, porque um POST é assumido. Se um GET é executada, em seguida, ocorrerão problemas, pois um estado inconsistente será definida. No código fonte modificado, você primeiro testar o verbo HTTP que está sendo chamado (ctx.Request. HttpMethod). Se um POST HTTP é chamado, em seguida, o conteúdo gerado é como o exemplo original formulário HTML, eo estado é guardado para a sessão (ctx.Session). Se um HTTP GET é chamado, em seguida, o conteúdo gerado é semelhante ao POST, exceto que o estado está recuperado da sessão.

POST de formulários e REST

No exemplo vez, o URL usa / artigos ajaxrest / Arquitectura / forms / AjaxPosted.ashx e usa uma sessão. O problema com esta abordagem é que os cookies HTTP são usados para determinar qual o conteúdo é gerado. A solução é utilizada para ilustrar o que pode ser relativamente fácil modificar uma aplicação existente que utiliza um POST em uma que usa Ajax combinado GET e POST. Em seguida, você modificar o POST e comece a combinação para não utilizar variáveis de sessão. Ou, para pô-lo de forma mais sucinta, é OK para usar variáveis de sessão, enquanto eles não usam cookies. Por exemplo, na arquitetura ASP.NET, é possível ter as variáveis de sessão modificar o URL para incluir um identificador que referências cruzadas para uma variável de sessão. Ter a infra-estrutura de modificar o URL que permite articlemark a URL e referenciá-lo em algum momento posterior. No entanto, você vai correr em um problema se você usar variáveis de sessão que o tempo limite. A timed-out variável de sessão, mesmo se ele não usa cookies, é problemático, porque os usuários poderão ter articlemarked a URL e descobriu mais tarde que não pode fazer referência-lo. É possível apenas para definir a variável de sessão para o tempo limite há muito tempo a partir de agora, mas isso não resolve o problema do Estado, eventualmente, desaparecendo. No caso deste artigo, a última coisa que você quer que aconteça é o desaparecimento do Estado.

Portanto, você precisará re-arquiteto do servidor para usar um cache em vez de variáveis de sessão. A vantagem do cache é que lhe dá a capacidade de controle quando um pedaço de estado permanece e é eliminado. O próximo problema é um pouco mais complicado. No exemplo a vez do formulário HTML, a página PostAjax.ashx respondeu a qualquer um GET ou POST. Quando o GET foi chamado, o estado da página HTML ea página HTML em si foram combinados em uma única etapa. Do artigo 5 º, você sabe que a combinação da página HTML com o seu estado é errado. Você quer ser capaz de carregar o estado como chamar o serviço aweb. Isto significa duas URLs são necessárias. O "Apoio páginas HTML com URLs relativas seção" no artigo 5 º mostra-lhe como gerir as duas URLs.

• / workflow/page1/1234: Esse URL é usado para fazer o download da página HTML que é exibida no navegador. A URL suporta apenas o verbo GET, como ele é usado para fazer o download do conteúdo HTML a partir do servidor.

• / services/workflow/page1/1234: Esta URL suporta tanto o GET e POST verbos e é o estado associado com a página HTML URL. O estado de URL é criado usando as técnicas explicadas na secção "Apoio páginas HTML com URLs relativas", no artigo 5. Ambos os URLs de exemplo são acrescentados com o número 1234, que representa os dados em cache identificador único utilizado durante o carregamento do estado. No estado e solução de página HTML, o Estado criado por uma página HTML é delegada a uma outra página. Olhar para trás, o código do exemplo pela forma de HTML. O estado da página HTML é associado com a página PostAjax.ashx. Com o Estado e solução de página HTML, o estado tem de ser associada com a página, e, portanto, a aplicação do HTML em vez muda de forma ligeiramente exemplo para o seguinte:

 Título 
   onload = "Initialize ()"> 

O código em negrito mostra as peças complementares necessárias à execução do estado e solução de página HTML. Como explicado no artigo 5 º, quando a página foi completamente carregado, o evento body.onload é acionado e chama a função Initialize. Chamando resultados Inicializar no estado a ser recuperadas usando a URL dinâmica computadorizada utilizando o URLEngine função. ServicesURL. Quando o Estado tem sido recuperado, é serializado e atribuiu à página HTML utilizando o serializeFromCGI métodos e iterateHTML.set. A implementação de OnSubmit permanece a mesma, com a modificação aminor sendo o URL onde o Estado é de ser publicado. A URL de POST deve ser o mesmo que o utilizado para recuperar os dados na função de inicialização. A próxima página que carrega depois que o estado permanece o mesmo, você pode modificá-lo ao seu gosto.

O URL que determina os mandados próxima página uma pequena discussão. No caso do código HTML, a URL é carregado / artigos ajaxrest / Arquitectura / forms / AjaxPosted.ashx. O URL não é anexado com um identificador de cache, o que significa que o URL não está associada a qualquer estado. No exemplo pela forma de HTML, um cookie define o estado que está associado com o URL. Desde que você não está usando cookies, o URL não tem estado. Se este é seu efeito desejado, então você pode deixar o código como está. Entanto, esta não é provavelmente o efeito desejado, por isso você precisa identificador associado a cache com a URL. Portanto, a URL deve ser / Ajax articles/architecture/forms/1234 / AjaxPosted.ashx ou algo nesse sentido. O bit importante é que o identificador único cache está incluído no URL. No entanto, o URL é codificado, por isso é necessário modificá-lo de forma dinâmica, bem como a abordagem ilustrada no artigo 5. Em poucas palavras, você precisa definir agrupamentos de URLs. Por exemplo, um fluxo de trabalho pode ter a URLs / workflow/app-name/page1, / workflow/app-name/page2, e assim por diante. Cada uma das URLs estaria associado com um identificador de cache. Assim, sempre que você navegar uma das URLs, você estará navegando em cache os dados associados com a aplicação de workflow.

Lembre-se os seguintes pontos:

• Utilizar a combinação POST GET XMLHttpRequest e evita o temido HTTP dados "Post novamente" caixa de diálogo. Você pode ficar descansado que os seus clientes não vão comprar o mesmo item duas vezes.

• Por ter GET e POST como etapas separadas, você pode otimizar a eficiência do aplicativo da Web, porque os dados associados com o GET podem ser armazenados em cache.

• Você não precisa fazer grandes mudanças no seu aplicativo da Web para aproveitar o post separado e GET, como ilustrado no exemplo pela forma de HTML.

• Em uma implementação completa do estado de navegação, use um dois-URL abordagem, onde se define a URL da página HTML, a URL eo segundo representa o estado do serviço Web chamado pela página HTML.

• Em uma implementação completa do estado de navegação, as URLs para o Estado e na página seguinte devem ser algorìtmica definível.

• Você pode combinar esta solução com os dados de validação artigos ilustrados no artigo 3.

• Para associar os dados em cache com uma URL, você não deve usar cookies, mas utilizar identificadores únicos em cache no URL. Isso permite que você articlemark uma página HTML e seu estado associados para consulta posterior.

um artigo submetido por Sonja Lande


Isenção de responsabilidade:O nosso site não se responsabiliza pelo conteúdo deste artigo. Webarticles é uma fonte de informação livre.
Importante: Este artigo "Não submeta seu Formulários Ajax Them" foi traduzida por um software automático. Nós sentimos muito por quaisquer erros de ortografia que pode ter ocorrido. Obrigado pela sua compreensão.


Online: 284 users browsing the articles directory