Comment puis-je faire < form method = "get" > dans ASP.Net pour un formulaire de recherche?

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

  •  11-07-2019
  •  | 
  •  

Question

J'ai un formulaire de recherche dans une application en cours de développement et j'aimerais qu'il soit l'équivalent de method = "GET" .

Ainsi, en cliquant sur le bouton de recherche, l'utilisateur accède à search.aspx? q = la + requête + il + est entré

La raison pour laquelle je le souhaite est tout simplement les URL pouvant être marquées d'un signet. En outre, il semble plus simple de le faire de cette façon.

Je ne souhaite pas non plus que la valeur du champ masqué viewstate soit ajoutée à l'URL.

Le mieux que je puisse trouver pour cela est:

  1. Capturez l'événement de clic côté serveur du bouton et de Response.Redirect .
  2. Attachez un gestionnaire Javascript onclick au bouton qui déclenche un window.location.replace .

Les deux se sentent bizarres et sous-optimales ... Pouvez-vous penser à une meilleure approche?

Était-ce utile?

La solution

Utilisez un ancien formulaire HTML, pas un formulaire côté serveur (runat = serveur), et vous devriez effectivement pouvoir le faire fonctionner.

Cela peut toutefois poser problème si vous avez une page maître Visual Studio prête à l'emploi qui enveloppe la page entière dans un formulaire côté serveur, car vous ne pouvez pas imbriquer des formulaires.

Les formulaires Web ne sont pas forcément gâtés, mais les implémentations par défaut le sont souvent. Vous n'êtes pas obligé d'utiliser des formulaires Web pour tout. Parfois, le code de requête post / get et process normal fonctionne parfaitement.

Autres conseils

J'ai travaillé sur un site Web qui devait publier sur un site tiers pour effectuer la recherche sur le site Web du client. J'ai fini par faire un simple Response.Redirect et transmis les paramètres de recherche à travers la chaîne de requête comme suit:

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

    Response.Redirect(SearchURL);
}

Et sur votre page Search.aspx dans votre page de chargement ...

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
    }
}

J'espère que cela vous aidera.

Cette fonction permet de soumettre une page à l'aide de la méthode GET.

Pour soumettre une page à l'aide de la méthode get, vous devez:

  1. ajoutez ce code Form.Method = "get "; dans la méthode Page_Load
  2. Utilisez ce code < asp: Button runat = " serveur " ID = " btnGenerate " / > en tant que bouton d'envoi
  3. ajouter l'attribut rel = "ne pas envoyer" " à tous les éléments de formulaire que vous ne souhaitez pas inclure dans votre chaîne de requête
  4. modifiez la logique codeback de votre page à l'aide de Request.QueryString
  5. désactivez l'état d'affichage de la page avec EnableViewState = "false" (sauf si cela est utilisé à d'autres fins)

Code

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

Je ferais (b) puisque (a) nécessiterait deux allers et retours pour une seule requête. Vous pouvez également désactiver viewstate sur la page, supprimer tout autre champ masqué via javascript et également utiliser javascript pour modifier la méthode de formulaire de post à obtenir. Je ne l'ai jamais fait pour de vrai, mais ma page de jouet utilisant l'exemple inclus fonctionnait à merveille. C’est sans doute plus simple que d’encoder la chaîne de recherche et d’obtenir l’objet via javascript.

En fait, il semblerait que vous seriez plus heureux avec ASP.NET MVC, car cela est facilement réalisable ici, en définissant simplement la méthode de formulaire sur GET dans la vue.

exemple de code utilisant jquery

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

MODIFIER: Il semble que vous devriez également pouvoir faire la même chose côté serveur. Peut-être dans OnPreRenderComplete. Vous n'avez pas accès à Visual Studio pour le moment.

J'ai toujours utilisé Response.Redirect car il "fonctionne".

Je ne pense pas qu'il existe une méthode optimale.

Utilisez-le simplement dans votre événement .click avant la soumission du formulaire:

    $("#__VIEWSTATE").remove();
    $("#__EVENTVALIDATION").remove();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top