14

現在開発中のアプリに検索フォームがあり、それを と同等にしたいと考えていますmethod="GET"

したがって、検索ボタンをクリックすると、ユーザーはsearch.aspx?q=the+query+he+entered

私がこれを望む理由は、単純に URL をブックマークできるようにするためです。

また、ビューステートの非表示フィールドの値を URL に追加することも望ましくありません。

これについて私が思いつくことができる最高のものは次のとおりです。

  1. ボタンと のサーバー側クリック イベントをキャプチャしますResponse.Redirect
  2. を起動するボタンにJavascriptonclickハンドラーをアタッチしますwindow.location.replace

どちらも風変わりで最適ではないように感じます...もっと良いアプローチを考えられますか?

4

6 に答える 6

11

サーバー側のフォーム (runat=server) ではなく、単純な古い html フォームを使用すると、実際に機能させることができるはずです。

ただし、フォームをネストできないため、サーバー側のフォームでページ全体をラップするすぐに使用できる Visual Studio マスター ページがある場合、これは問題になる可能性があります。

Web フォームが悪いわけではありませんが、デフォルトの実装はしばしばそうです。すべてに Web フォームを使用する必要はありません。場合によっては、単純な古い post/get およびプロセス リクエスト コードで問題なく動作することがあります。

于 2008-11-26T01:15:00.167 に答える
7

私は、クライアントの Web サイトで検索を行うために、サード パーティのサイトに投稿する必要がある Web サイトに取り組みました。私は単純な Response.Redirect を実行することになり、次のようにクエリ文字列を介して検索パラメーターを渡しました。

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

    Response.Redirect(SearchURL);
}

そして、ページロードの Search.aspx ページで...

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

お役に立てれば。

于 2010-04-12T17:55:17.660 に答える
4

This function permits to submit a page using the GET method.

To submit a page using the get method you need to:

  1. add this code Form.Method="get"; in the Page_Load method
  2. Use this code < asp:Button runat="server" ID="btnGenerate" /> as a submit button
  3. add rel="do-not-submit" attribute to all form elements that you don't want to include in your query string
  4. change the codebehind logic of your page using Request.QueryString
  5. disable the page viewstate with EnableViewState="false" (unless it's used for other purposes)

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;
});
于 2010-11-04T02:04:26.170 に答える
0

(a) では 1 回のクエリで 2 回の往復が必要になるため、(b) を実行します。または、ページのビューステートを無効にし、javascript を使用して他の隠しフィールドを削除し、javascript を使用してフォーム メソッドを post から get に変更することもできます。実際にこれを行ったことはありませんが、付属のサンプルを使用したおもちゃのページは魅力的でした. 検索文字列をエンコードして JavaScript 経由で取得するよりも間違いなく簡単です。

実際には、ビューでフォーム メソッドを GET に設定するだけで簡単に実行できるため、ASP.NET MVC の方が満足しているように思えます。

jqueryを使ったサンプルコード

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

編集:サーバー側でも同じことができるはずです。多分OnPreRenderCompleteにあります。確認するには、現在 Visual Studio にアクセスできません。

于 2008-11-26T03:12:16.153 に答える
0

フォーム送信前に .click イベントでこれを使用するだけです:

    $("#__VIEWSTATE").remove();
    $("#__EVENTVALIDATION").remove();
于 2016-01-20T19:21:08.920 に答える
0

「機能する」ため、私は常に Response.Redirect を使用してきました。

最適な方法はないと思います。

于 2008-11-26T03:28:21.193 に答える