14 Stimmen

Wie kann ich <form method="get"> in ASP.Net für ein Suchformular verwenden?

Ich habe ein Suchformular in einer App, die ich gerade entwickle, und ich möchte, dass es das Äquivalent von method="GET" .

Wenn der Benutzer also auf die Schaltfläche "Suchen" klickt, gelangt er zu search.aspx?q=the+query+he+entered

Der Grund, warum ich dies möchte, ist einfach bookmarkable URLs, plus es fühlt sich sauberer, es auf diese Weise zu tun.

Ich möchte auch nicht, dass der Wert des ausgeblendeten Feldes viewstate an die URL angehängt wird.

Das Beste, was mir zu diesem Thema einfällt, ist:

  1. Erfassen Sie das serverseitige Klick-Ereignis der Schaltfläche und Response.Redirect .
  2. Anhängen eines Javascript onclick Handler für die Schaltfläche, die eine window.location.replace .

Beides wirkt skurril und suboptimal... Fällt Ihnen ein besserer Ansatz ein?

11voto

seanb Punkte 6859

Verwenden Sie ein einfaches, altes HTML-Formular, kein serverseitiges Formular (runat=server), und Sie sollten tatsächlich in der Lage sein, es zum Laufen zu bringen.

Dies könnte jedoch ein Problem darstellen, wenn Sie eine Standard-Visual-Studio-Masterseite haben, die die gesamte Seite in ein serverseitiges Formular einhüllt, da Sie keine Formulare verschachteln können.

Webformulare müssen nicht schlecht sein, aber die Standardimplementierungen sind es oft. Sie müssen nicht für alles Webformulare verwenden. Manchmal reicht ein einfacher alter Post/Get- und Process-Request-Code völlig aus.

7voto

Solburn Punkte 1168

Ich habe an einer Website gearbeitet, die auf eine Website eines Drittanbieters verweisen musste, um die Suche auf der Website des Kunden durchzuführen. Am Ende habe ich eine einfache Response.Redirect gemacht und die Suchparameter über den Query-String wie folgt übergeben:

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

    Response.Redirect(SearchURL);
}

Und auf Ihrer Search.aspx Seite in Ihrem 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
    }
}

Ich hoffe, das hilft.

4voto

Valerio Gentile Punkte 1006

Mit dieser Funktion können Sie eine Seite mit der GET-Methode übermitteln.

Um eine Seite mit der get-Methode zu übermitteln, müssen Sie Folgendes tun:

  1. diesen Code hinzufügen Form.Method="get"; in der Methode Page_Load
  2. Verwenden Sie diesen Code < asp:Button runat="server" ID="btnGenerate" /> als Schaltfläche "Senden
  3. hinzufügen. rel="nicht-übermitteln" Attribut für alle Formularelemente, die Sie nicht in Ihre Abfragezeichenfolge aufnehmen wollen
  4. Ändern Sie die Logik hinter dem Code Ihrer Seite mit Anfrage.QueryString
  5. Deaktivieren Sie die Seite viewstate mit EnableViewState="false" (sofern sie nicht für andere Zwecke verwendet wird)

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

0voto

tvanfosson Punkte 506878

Ich würde (b) machen, da (a) zwei Hin- und Rückreisen für eine einzige Abfrage erfordern würde. Alternativ könnten Sie viewstate auf der Seite deaktivieren, entfernen Sie alle anderen versteckten Felder über Javascript, und verwenden Sie auch Javascript, um die Form-Methode von post zu bekommen ändern. Ich habe dies nie wirklich getan, aber mein Spielzeug Seite mit dem mitgelieferten Beispiel funktionierte wie ein Charme. Es ist wohl einfacher als die Kodierung der Suchzeichenfolge und tun das Get über Javascript.

Eigentlich klingt es wie Sie wäre glücklicher mit ASP.NET MVC, da dies leicht machbar ist, indem Sie einfach die Form-Methode auf GET in der Ansicht festlegen.

Beispielcode mit Jquery

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

EDIT : Es scheint, dass man das Gleiche auch serverseitig tun können sollte. Vielleicht in OnPreRenderComplete. Ich habe gerade keinen Zugriff auf Visual Studio, um das zu überprüfen.

0voto

cbp Punkte 24483

Ich habe immer Response.Redirect verwendet, weil es "funktioniert".

Ich glaube nicht, dass es eine optimale Methode gibt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X