Come posso fare < form method = & # 8220; get & # 8221; > in ASP.Net per un modulo di ricerca?

StackOverflow https://stackoverflow.com/questions/319413

  •  11-07-2019
  •  | 
  •  

Domanda

Ho un modulo di ricerca in un'app che sto attualmente sviluppando e vorrei che fosse l'equivalente di method = " GET " .

Pertanto, facendo clic sul pulsante di ricerca, l'utente passa a search.aspx?q=the+query+he+entered

Il motivo per cui lo voglio sono semplicemente gli URL con segnalibro, inoltre mi sembra più pulito farlo in questo modo.

Non voglio nemmeno aggiungere il valore del campo nascosto viewstate all'URL.

Il meglio che ho potuto inventare per questo è:

  1. Cattura l'evento click sul lato server del pulsante e Response.Redirect .
  2. Collega un gestore Javascript onclick al pulsante che attiva un window.location.replace .

Entrambi si sentono eccentrici e non ottimali ... Riesci a pensare a un approccio migliore?

È stato utile?

Soluzione

Usa un semplice vecchio modulo HTML, non un modulo lato server (runat = server), e dovresti davvero essere in grado di farlo funzionare.

Questo potrebbe tuttavia essere un problema se si dispone di una pagina principale di Visual Studio pronta all'uso che avvolge l'intera pagina in un modulo lato server, poiché non è possibile nidificare i moduli.

I moduli Web non devono risucchiare, ma lo fanno spesso le implementazioni predefinite. Non è necessario utilizzare i moduli Web per tutto. A volte il semplice vecchio codice di richiesta post / get e process andrà bene.

Altri suggerimenti

Ho lavorato su un sito Web che doveva pubblicare su un sito di terze parti per effettuare la ricerca sul sito Web del cliente. Ho finito per fare un semplice Response.Redirect e ho passato i parametri di ricerca attraverso la stringa di query in questo modo:

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

    Response.Redirect(SearchURL);
}

E sulla tua pagina Search.aspx nel tuo 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
    }
}

Spero che questo aiuti.

Questa funzione consente di inviare una pagina utilizzando il metodo GET.

Per inviare una pagina utilizzando il metodo get è necessario:

  1. aggiungi questo codice Form.Method = " get " ;; nel metodo Page_Load
  2. Usa questo codice < asp: Button runat = " server " ID = " btnGenerate " / > come pulsante di invio
  3. aggiungi l'attributo rel = " non-inviare " a tutti gli elementi del modulo che non desideri includere nella stringa di query
  4. cambia la logica del codice dietro la tua pagina usando Request.QueryString
  5. disabilita il viewstate della pagina con EnableViewState = " false " (a meno che non sia utilizzato per altri scopi)

Codice

$(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;
});

Vorrei fare (b) poiché (a) richiederebbe due round trip per una singola query. In alternativa, è possibile disabilitare viewstate sulla pagina, rimuovere qualsiasi altro campo nascosto tramite javascript e utilizzare javascript per modificare il metodo del modulo da post a get. Non l'ho mai fatto sul serio, ma la mia pagina di giocattoli usando l'esempio incluso ha funzionato come un fascino. È probabilmente più facile che codificare la stringa di ricerca e fare get tramite javascript.

In realtà, sembra che saresti più felice con ASP.NET MVC poiché questo è facilmente realizzabile lì semplicemente impostando il metodo form su GET nella vista.

codice di esempio usando jquery

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

EDIT: Sembra che dovresti essere in grado di fare anche la stessa cosa sul lato server. Forse in OnPreRenderComplete. Non hai accesso a Visual Studio in questo momento per verificare.

Ho sempre usato Response.Redirect come " funziona " ;.

Non credo che esista un metodo ottimale.

Usa questo nel tuo evento .click prima dell'invio del modulo:

    $("#__VIEWSTATE").remove();
    $("#__EVENTVALIDATION").remove();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top