2009-05-08 12 views
1

私は1つのページに2つのコントロールがあり、1つは検索エントリとサブミットコントロール、もう1つは検索結果コントロールであり、サイトのレイアウトのために。私は検索コントロールを持っているさまざまな方法を見て、検索結果を結果コントロールに表示することを提出しました。最初はポストバックを気にしませんでした。ASP.Netの検索コントロールと同じページに検索結果を表示する最善の方法

1)選択した検索条件を同じページ(または実際に結果を表示するコントロール)QUERystring、hiddenfield、session、viewstate(事実上隠されたフィールド)?

2)実際にページを自分自身に送信する方法を教えてください。

謝罪これは少し基本的ですが、場合イムないASP.Netの専門家

答えて

2

あなたが求めていると私は正しい答えがあることがわからない正直に言うと何をしてのために多くの、多くの方法があります。それはあなたの開発スタイルとあなたが解決しようとしている問題によって異なります。

私は検索インターフェイスの作成に関してかなりの経験がありますが、クエリ文字列を使用することは検索条件を渡す良い方法です。しかし、これはそのアドバタイズとその欠点があります。

長所:

  • あなたは、単にクエリ文字列を渡すことで、あなたのサイトや外部サイトのどこからでも検索結果ページに取得することができます。

  • 検索結果は、サイトのページと同じように簡単にクロールできます。

  • クエリ文字列はかなり簡単に使用できます。

  • ユーザーは、クエリ文字列で検索している内容を確認できます。 (ただしこれは、その使用によっては悪いことかもしれません。)

  • マークthierのserach結果(感謝のFredrikモーク)

短所予約することができます

  • ユーザー:

    • あなたがする必要があるかもしれませんがあなたの検索条件をきれいに見せるために時間をかけてください。 I.あなたのユーザーには何も意味しないIDを見せたいですか?

    • クエリ文字列の引数として渡す必要があるため、検索基準のエンコードに問題がある可能性があります。エンコーディングは簡単に行うことができますが、他のもののために予約された文字を使用していると頭痛になることがあります。

    • あなたのユーザーは、探しているものを見ることができます。 (私が言ったように、これは良いことか悪いことかもしれません)。

    • あなたのクエリ文字列は非常に長くなるかもしれません。

    私が考えていない他のものがありますが、それはあなたにアイデアを与えます。

    ページを自分自身に再度ポストする方法はいくつかありますが、href属性として#記号が付いた送信ボタンまたはアンカータグを試してみてください。

    あなたの醜いクエリ文字列を見栄えの良いURLにするためにURLリライタを使用している可能性があります。例えば

    used_car_search.aspx

    になるでし注力= =フォード&モデルを作る:?これらは:)

  • +0

    私はプロ側でもう1つを追加します。私の意見で最も重要なのは、検索結果がブックマーク可能になることです。それは(私の目で)良い検索インターフェースの非常に重要な特徴です。 –

    +0

    @Fredrik Mork - 良い点。 – lexx

    +0

    ありがとう、私はquerystringsから自分自身を避けていたが、プロは私の立場から短所を上回る – Matt

    2

    コーディング

    used_ford_focus.html

    ハッピーUserControls、正しい?私はUserControls間で通信する最善の方法は、イベントを使用することだと思います。独自のEventArgsクラスを作成して、検索条件をカプセル化します。サブミッションコントロールは、検索が送信されたときにイベントを発生させ、含まれているページがイベントを処理し、検索結果コントロールを表示して検索結果を表示します。

    代わりに、結果コントロールはオブジェクトのコレクションを表示するだけでよく、検索コントロールは実際に検索を実行し、EventArgsでコレクションを返します。

    次は、UserControlのマスター/ディテールセットの例です。 ProjectListユーザーコントロールは、プロジェクトが選択されているイベントを発生させます:

    public event EventHandler<ProjectSelectedEventArgs> ProjectSelected; 
    
        protected void uxProjectList_OnSelectedIndexChanged(object sender, EventArgs e) 
        { 
         if (ProjectSelected != null) 
         { 
          var keys = uxProjectList.DataKeys[uxProjectList.SelectedIndex].Values; 
          var projectId = (Guid)keys[0]; 
    
          var args = new ProjectSelectedEventArgs(projectId); 
          ProjectSelected(this, args); 
         } 
        } 
    

    コンテナページは、イベントを処理し、プロジェクトの詳細を表示するProjectDetailユーザーコントロールのメソッドを呼び出します。

    protected void uxHeroProjectList_ProjectSelected(object sender, ProjectSelectedEventArgs e) 
        { 
    
         uxProjectDetails.Visible = true; 
         uxProjectDetails.DisplayDetails(e.ProjectId); 
        } 
    
    関連する問題