動的な“高度な検索を構築するためのアドバイス” ASP.NETでの制御

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

質問

代替テキストhttp://img3.imageshack.us/img3/1488/advancedsearch。 png

「高度な検索」を作成していますASP.NETアプリケーションのインターフェイス。このことを書くのにSOは必要ありませんが、動的コントロールとViewStateに関する特定の問題にこだわっています。これにアプローチする方法について、いくつかの方向性を教えてください。私の状況は次のとおりです。

成分:

  • エンティティ、フィールド、検索を表すAPIオブジェクトのサービス可能なセット。検索の構築、SQLの生成、結果の返送を処理します。これですべてが処理されます。
  • ASP.NET 3.5

望ましいインターフェース機能:

(1)最初のページの読み込み時に、インターフェイスはSearchCriterionオブジェクトのセットを使用して事前構成された検索オブジェクトを取得します。コントロールを一連のコントロールにバインドします(上の画像を参照)。

  • 一部の検索項目は次のように単純です:

    フィールド(DropDownList)|演算子(DropDownList)|値(TextBox)

  • 一部のフィールドタイプの検索条件コントロールには、次のような重要な情報がビューステートに保存されています。

    フィールド(DropDownList)|演算子(DropDownList)|値(DropDownList)ここで、「値」はドロップダウンリストにはデータベースクエリが入力されます。

  • 一部のフィールドは他のエンティティへのルックアップであり、次のようなフィールドセレクターのチェーンが発生します。

    フィールド(DropDownList)フィールド(DropDownList)|演算子(DropDownList)|値

(2)ユーザーは次の方法で検索を変更します。

  • それぞれのボタンをクリックして検索条件を追加および削除する
  • フィールド、演算子、または値を変更して既存の基準を構成します。フィールドまたは演算子を変更するには、使用可能な演算子を変更し、「値」を変更して、コントロールがそれ自体を再構成する必要があります。別のタイプへの入力コントロール、または" Fields"からのDropDownListsの追加/削除。参照タイプのフィールドが選択/選択解除されている場合のセクション。

(3)最後に、ユーザーは「検索」をクリックします。結果を確認します。

問題:

この質問に答えているかどうかはご存知でしょうが、ページに動的に追加されたコントロールはポストバック時に消えます。添付の画像でわかるように、コントロールコレクションを操作し、上記の手順(1)をきちんと実行するUserControlを作成しました。 (明らかに、この時点でスタイルは気にしません。)

ただし、ポストバックでは、コントロールがすべてなくなり、Search APIオブジェクトがなくなりました。動的に生成されたコントロールコレクションを取得してViewStateに固定できる場合、ポストバックでコントロールを調べ、Searchオブジェクトを再構築し、コントロールイベントを適切に処理できます。

可能な解決策

  • Searchオブジェクトをシリアル化して、ビューステートに保存できます。次に、ページの読み込み時にそれを取得し、ページの読み込み時にコントロールコレクションを再構築できます。ただし、イベントを発生させるコントロールでこれがうまく機能するかどうかはわかりません。データベースからのデータを含むドロップダウンリストのビューステートはどうなりますか?ポストバックごとにデータベースを再クエリする必要があることは非常に望ましくありません。

  • カスタムサーバーコントロールを開発できました(このリンクを参照)この種のことについては...しかし、それは私にとって新しいトピックであり、ある程度の学習が必要になるでしょう。さらに、カスタムサーバーコントロールが非固定コントロールコレクションでこれ以上うまく機能するかどうかはわかりません。誰もがそれについて知っていますか?

  • データバインドされたコントロールを使用してこれを達成できると考えていました-たとえば、基準コレクションを、コントロールコレクションが固定されたリピーターにバインドできます(

役に立ちましたか?

解決

私は約1日間コーディングを続けてきましたが、質問で提案した3番目のオプションである古い学校のデータバインドコントロールを使用して、これをうまく機能させました。実際、私は質問を詳細に書き出すことを余儀なくされたときだけ考えを考えました-それはいつもあなたにいつでも起こりませんか?

SearchCriterionControlをasp:Repeaterに入れ、オブジェクトコレクションにバインドしました。 Field Chooserでは、ネストされたasp:Repeater内にasp:DropDownListを配置し、それにField配列をバインドしました。すべてが美しく機能し、状態を維持し、実際には非常に少ないコードしか必要としません。そのため、コントロールをページに動的に追加する必要はありませんでした。よろしくお願いします。

ご提案ありがとうございます、エンダー、マット、アンドリューウィン。

他のヒント

他の誰もこれを2時間刺したことがないので、ビューステート(またはASP.NETモデルのポストバック)にまったく依存しないソリューションを使用して、リングに帽子をかぶせます。

jQueryを使用してすべての入力値を取得し、ポストバックを行う代わりにページ(または新しいresults.aspxページ)に対してポストを実行した場合はどうなりますか?または、全体を非同期にして、Webメソッドに対してAjaxリクエストを行い、結果を取得し、必要に応じてクライアント側に入力できますか?

ここでの不幸な点は、データがビューステートで渡されないため、検索クエリの構築に使用されたコントロールのタイプを再構築する必要があることです。しかし、とにかく、入力データを何らかの方法でクエリフォームに変換する必要があると思います。

こちらを読む jQueryを使用してASP.NETページメソッドをヒットする方法の詳細について。覚えておいてください-ページメソッドは静的である必要があります(簡単に監視できます)。

クエリを構築するためにサーバー側で何をしているのかわかりませんが、LINQを非常に推奨します。同様の「高度な検索」を行いましたLINQtoSQLを使用してSQLをヒットしたか、メモリ内のオブジェクトのコレクションをヒットしただけであるかに関係なく、LINQがこの問題の素晴らしいツールであることがいくつかの異なる試みで判明しました。

1)LINQは実行の遅延、2)LINQクエリは別のクエリ可能なオブジェクトを返すため、これは非常にうまく機能しました。ここでの意味は、SQLまたは使用しているバックストアへの単一の大規模な句変換を行う代わりに、入力から構築するときにLINQクエリをチェーン化できることです(私の試みの1つは、文字列でSQL句を構築することでしたが、ただし、SQLインジェクション保護のためにSQLParametersを介して入力データを渡します-手作りのLINQを理解し、実装するのが桁違いに簡単だった場合、面倒で複雑でした。

例:

List<string> data; // or perhaps your a DB Context for LINQtoSQL?

var query = data.Where(item => item.contains("foo"));

if( {user supplies length search option} )
    query = query.Where(item => item.Length < 5);

// etc, etc.

// LINQ doesn't do anything until the query is iterated, at which point
// it will construct the SQL statement without you worrying about details or parameter binding
foreach(string value in query)
    ; // do something with the results

遅延実行とクエリ可能な戻り値型のため、LINQクエリを終日この式に連結し、実行時に実装の詳細(SQLクエリへの変換など)を心配させることができます。

必要な手順を正確に提供することはできませんが、asp.netページのライフサイクルを検討することを強くお勧めします。ユーザーコントロールをDLLとして一度作成しました。ライフサイクルの特定のステップでポストバックデータをキャプチャし、他のステップでデータを再作成および再バインドする必要がありました。さらに、ビューステートのような思考は、特定のポイントでのみ利用可能です。 On_init、On_prerender、その他のメソッドをオーバーライドしなければならなかったことを知っています。

申し訳ありませんが、私はこれ以上助けができませんでしたが、私にはコードがありません(古い雇用主のコードです)。これがお役に立てば幸いです。

コントロールをコントロールツリーに動的に追加する場合は、ポストパックにもコントロールを追加する必要があります。 Page_LoadまたはPage_Initにコントロールを構築するメソッドを呼び出すだけで、コントロールはポストバック時にページにとどまるはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top