Pergunta

Eu tenho um formulário de pesquisa em um aplicativo que estou desenvolvendo atualmente, e eu gostaria que ele seja o equivalente a method="GET".

Assim, ao clicar no botão de pesquisa, o usuário vai para search.aspx?q=the+query+he+entered

A razão que eu quero que este é URLs simplesmente bookmarkable, mais ele se sente mais limpo para fazê-lo desta forma.

Eu também não quero que o valor do campo viewstate escondido anexado ao URL também.

O melhor que eu poderia vir acima com para isto é:

  1. capturar o evento do lado do servidor clique do botão e Response.Redirect.
  2. Anexar um manipulador onclick o Javascript para o botão que dispara um window.location.replace.

Ambos peculiar sensação e sub-óptima ... Você pode pensar em uma abordagem melhor?

Foi útil?

Solução

Use uma forma simples de idade html, não é uma forma do lado do servidor (runat = server), e você deve certamente ser capaz de fazê-lo funcionar.

Esta poderia, contudo, ser um problema se você tem um fora da página mestra visual studio caixa que envolve toda a página de uma forma lado do servidor, porque você não pode formas ninho.

formulários da Web não tem que chupar, mas as implementações padrão costumam fazer. Você não tem que usar formulários web para tudo. Às vezes simples post antigo / get e código de solicitação de processo vai fazer muito bem.

Outras dicas

Eu trabalhei em um web site que tinha para deixar a um terceiro local da festa para fazer a pesquisa no site do cliente. Acabei fazendo uma simples Response.Redirect e passado nos parâmetros de busca através da string de consulta assim:

protected void Button1_Click(object sender, EventArgs e)
{
    string SearchQueryStringParameters = @"?SearchParameters=";
    string SearchURL = "Search.aspx" + SearchQueryStringParameters;

    Response.Redirect(SearchURL);
}

E na sua página Search.aspx em sua pageload ...

protected void Page_Load(object sender, EventArgs e)
{
    if (!string.IsNullOrEmpty(Request.QueryString["SearchParameters"]))
    {
        // prefill your search textbox
        this.txtSearch.Text = Request.QueryString["SearchParameters"];

        // run your code that does a search and fill your repeater/datagrid/whatever here
    }
    else
    {
        // do nothing but show the search page
    }
}

Espero que isso ajude.

Esta função permite enviar uma página usando o método GET.

Para enviar uma página usando o método get é necessário:

  1. adicione este código Form.Method = "get"; no método Page_Load
  2. Use este código como um botão de envio
  3. add rel = "do-not-submit" atributo para todos os elementos de formulário que você não deseja incluir em sua string de consulta
  4. mudar a lógica codebehind de sua página usando Request.QueryString
  5. desativar o viewstate página com EnableViewState = "false" (a menos que seja utilizado para outros fins)

Código

$(document).ready(function(){ enableSubmitFormByGet(); });

function enableSubmitFormByGet(){
   if($("form").attr("method") == "get"){
        $("form").submit(function() {
            $("[name^=" + "ctl00" + "]").each(function(i){
            var myName = $(this).attr("name");
            var newName = "p" + (i-1);
            $(this).attr("name", newName);
        });
     var qs =$(this).find("input[rel!='do-not-submit'],textarea[rel!='do-not-submit'],select[rel!='do-not-submit'],hidden[rel!='do-not-submit']").not("#__VIEWSTATE,#__EVENTVALIDATION,#__EVENTTARGET,#__EVENTARGUMENT").serialize();
     window.document.location.href = "?" + qs;
     return false;
});

eu faria (b) uma vez que (a) exigiria duas idas e voltas para uma única consulta. Alternativamente, você pode desativar viewstate na página, remova quaisquer outros campos ocultos via javascript, e também usar javascript para modificar o método de forma de pós para chegar. Eu nunca fiz isso de verdade, mas minha página brinquedo usando o exemplo incluído funcionou como um encanto. É sem dúvida mais fácil do que codifica a cadeia de pesquisa e fazer a get via javascript.

Na verdade, parece que você seria mais feliz com ASP.NET MVC uma vez que este é facilmente factível há simplesmente definindo o método de formulário para entrar em modo de exibição.

código de exemplo usando jQuery

 $(document).ready( function() {
     $('input[type=hidden]').remove();
     $('form').attr('method','get');
 });

EDIT: Parece que você deveria ser capaz de fazer o server-side mesma coisa, também. Talvez em OnPreRenderComplete. Não têm acesso a Visual Studio agora para verificar.

Eu sempre usei Response.Redirect como ele "funciona".

Eu não acho que há um método ideal.

Basta usar isso em seu evento .click antes do envio do formulário:

    $("#__VIEWSTATE").remove();
    $("#__EVENTVALIDATION").remove();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top