Pergunta

Eu preciso encontrar se o usuário clicar no botão de navegador de volta ou o botão Atualizar.

Eu preciso redirecionar a página para página de erro quando ele clica no botão Voltar ou atualização. Como fazer isso.

Eu preciso fazer isso em javascript para minha página ASP.net

Foi útil?

Solução

Em primeiro lugar, dando mensagens de erro se os usuários usam Voltar ou tem que atualizar uma página por qualquer motivo, é uma péssima idéia. Em vez disso, você deve transparente lidar com isso. Pense em uma página não chegando totalmente por causa de problemas no nível de transporte -. A única opção que o usuário tem é o de recarga ou voltar

Para responder à sua pergunta, você tem que manter o controle de navegação do usuário mesmo, que os meios no lado do servidor. Esqueça java-script aqui. Se o usuário visita um site, você pode armazenar essas informações em uma sessão associada ao usuário (existem vários métodos de manter estas sessões únicas, e eu não vou entrar em detalhes aqui). Se você armazenar em suas estruturas internas as páginas que o usuário visitou recentemente, é fácil determinar a página que está sendo visitada duas vezes, ou a navegação indo na direção "errada".

Você poderia facilmente generalizar este (e fazendo a coisa toda mais robusto, por exemplo, contra usuários pulando descontroladamente entre urls, ou voltar mais do que um passo de cada vez) através da construção de um gráfico de "permitido" de navegação e atravessando-o, enquanto o usuário está visitando sites.

O comportamento correto, em seguida, se o usuário está fazendo uma navegação "errado" (como voltar, recarregar == visitar duas vezes) é levá-lo de volta aos trilhos. Não dar uma mensagem de erro que ele não pode escapar! Como ele não tem permissão para recarregar ou ir para trás, ele não tem opções à esquerda.

Outras dicas

Você não pode. O navegador não envia o seu próprio eventos ui para o servidor. Tudo que você começa são HTTP solicitações e uma aparência praticamente igual ao outro. Talvez o clicado no botão voltar ou talvez eles simplesmente retyped a última url dentro. Diga-nos quais os problemas que está causando e podemos ajudá-lo a adaptar o seu projeto para trabalhar com o protocolo http um pouco melhor.

Implementar um pageToken usando um guid / ou timestamp armazenado na sessão e comparar o valor de um campo oculto no formulário. Eu fiz isso através de um pageToken Classe . Se o valor do campo oculto e a variável de sessão não coincidem, então você está fora de sincronia e você lidar com isso. O truque é mapear todos os eventos em sua página.

public void GeneratePageToken()
{
    SessionVariables currSession = new SessionVariables();
    hfMasterPageToken.Value = System.DateTime.Now.ToString();
    currSession.PageToken = hfMasterPageToken.Value;
}

public string GetLastPageToken
{
    get
    {
        SessionVariables currSession = new SessionVariables();
        return currSession.PageToken;
    }
}

public bool TokensMatch
{
    get
    {
        SessionVariables currSession = new SessionVariables();
        return (currSession.PageToken != null
            && currSession.PageToken == hfMasterPageToken.Value);
    }
}

No seu método de evento antes de seu código normal:

if (this.TokensMatch == false)
{
    //Reload the data.
    //Generates a NewPageToken (this.GeneratePageToken();)
    ReloadDataMethod();
    this.MessageToUser =
     "Data reloaded.  Click Edit or Insert button to change.";
    this.MessageType = MessageToUserType.Success;
    this.DisplayMessageToUser = true;
    return;
}

Com Site.Master

Em seu Site.Master, coloque depois <body>

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
<dx:ASPxLoadingPanel ID="MainLoadingPanel" runat="server" ClientInstanceName="MainLoadingPanel" Modal="True" />
<input type="hidden" id="refreshed" value="no" />
<script type="text/javascript" language="javascript">
    MainLoadingPanel.Show();
    window.onload = function () {
        var e = document.getElementById("refreshed");
        if (e.value == "no") {
            MainLoadingPanel.Hide();
            e.value = "yes";
        } else {
            e.value = "no";
            location.reload(true); // Reload the page or redirect...
        }
    };
</script>

Sem Site.Master

Em seu código comum, colocada após <body>

<input type="hidden" id="refreshed" value="no" />
<script type="text/javascript" language="javascript">
    window.onload = function () {
        var e = document.getElementById("refreshed");
        if (e.value == "no") {
            e.value = "yes";
        } else {
            e.value = "no";
            location.reload(true); // Reload the page or redirect...
        }
    };
</script>

Eu presumo que você quer fazer isso por causa de post-back para evitar enviar novamente alguma ação ou dados certo? ironicamente, isso não foi tão grande de um problema nas costas antes de asp.net webforms ... porque você geralmente tinha que post para um URL diferente, em vez da mesma (muito parecido com asp.net MVC na verdade).

Um truque que eu gostava de usar ... mesmo que no mais técnica dos pontos é mais lento ... era ter uma página de entrada, e uma página post. A saída HTML da página da mensagem foi alguns super HTML mínimo com um pequeno javascript que substituiu a url atual (da página post) na história do navegador com a página de resultados (ou mesmo a página original referindo-se você realmente queria). O resultado foi quando o usuário deverá clicar no botão voltar, ele seria enviado para a página de entrada original, ou se ele clicou refrescar, ele já estaria na nova página de resultados.

<html><body onload="location.replace('someURL.asp')"></body></html>

Nós fizemos isso em Java / Struts1, colocando uma propriedade no botão enviar. Se o botão enviar foi clicado o texto do botão seriam enviados na propriedade na ActionForm. Se o usuário atualizada a informação que o valor não foi definido, então nós sabíamos que o usuário não tivesse clicado no botão. Neste caso em que o imóvel estava vazio, fomos para trás e tornou a primeira página do PageFlow. YMMV em ASP.Net.

Isso simplesmente detecta se as terras de usuário em sua página utilizando os botões / para trás para a frente ... o único problema é com o IE8 e diminuir, a versão do navegador não pode lidar com isso.

if(performance.navigation.type == 2)
{
    //Do your code here
}

.NET 3.5 pode muito bem lidar com a parte de trás do navegador (e para a frente) botões. Busca com Google: "scriptmanager EnableHistory". Você pode controlar quais as ações do usuário irá adicionar uma entrada para a história do navegador (ScriptManager -> AddHistoryPoint) e sua aplicação ASP.NET recebe um evento sempre que o usuário clica no navegador Voltar / Avançar botões.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top