Frage

alt text http://img3.imageshack.us/img3/1488/advancedsearch. png

Ich baue eine "Advanced Search" Schnittstelle in einer ASP.NET-Anwendung. Ich weiß nicht so brauche diese Sache für mich zu schreiben, aber ich bin auf einem bestimmten Problem in Bezug auf dynamische Kontrollen und Viewstate stecken. Ich möchte einige Richtung, wie dies zu nähern. Hier ist meine Situation:

Zutaten:

  • Ein wartbaren Satz von API-Objekte repräsentieren Entitäten, Felder und Durchsuchungen, die eine Suche Handles Konstruktion, Erzeugung von SQL, und die Ergebnisse zurück. Also das ist für alles gesorgt.
  • ASP.NET 3.5

Gewünschte Schnittstelle Funktionalität:

(1) Bei der ersten Seite zu laden, wird die Schnittstelle eine vorkonfigurierte Suchobjekt mit einem Satz von SearchCriterion Objekten. Es bindet sich in eine Reihe von Kontrollen (siehe Bild oben).

  • Einige Suchbegriffe sind einfacher, wie:

    Field (Dropdownlist) | Operator (Dropdownlist) | Wert (TextBox)

  • Suchkriterium Kontrollen für einige Feldtypen haben wichtige Informationen in Ansichtszustand gespeichert, wie:

    Field (Dropdownlist) | Operator (Dropdownlist) | Wert (Dropdownlist), wo die "Value" Dropdownlist von einer Datenbankabfrage gefüllt wird.

  • Einige Felder sind Lookups auf andere Entitäten, die eine Kette von Feld Selektoren bewirkt, wie:

    Field (Dropdownlist) Field (Dropdownlist) | Operator (Dropdownlist) | Wert

(2) Der Benutzer ändert die Suche nach:

  • Hinzufügen und Entfernen von Suchkriterien, indem Sie entsprechende Tasten
  • Konfigurieren von bestehenden Kriterien durch das Feld, Operator oder Wert zu ändern. Änderungen an Feld oder Operator die Steuerung erfordern, sich zu rekonfigurieren, indem die verfügbaren Operatoren zu ändern, die Änderung der „Value“ Eingabesteuerung auf eine andere Art, oder das Hinzufügen / Dropdownlists aus dem „Fields“ Abschnitt zu entfernen, wenn Lookup-Typ Felder ausgewählt werden / nicht ausgewählten .

(3) Schließlich wird der Benutzer trifft auf "Suchen" ihre Ergebnisse zu sehen.

Das Problem:

Wie Sie wahrscheinlich bereits wissen, wenn Sie diese Frage sind zu beantworten, Steuerelemente dynamisch in die Seite eingefügt auf Postbacks verschwinden. Ich habe ein Usercontrol erstellt, die die Kontrolle Sammlung manipuliert und ordentlich erfüllen Schritt (1) oben, wie Sie in der beigefügten Abbildung zu sehen sind. (Ich bin nicht besorgt über Stil an dieser Stelle offensichtlich.)

Allerdings auf Postback werden die Kontrollen alle weg, und meine Search API Objekt ist weg. Wenn ich die dynamisch generierte Steuer Sammlung nur erhalten könnte spielen schön und bleiben in Viewstate, konnte ich die Steuerelemente auf Postbacks untersuchen, den Wiederaufbau der Suche Objekt, dann die Kontrolle Ereignisse behandeln ordentlich.

Mögliche Lösungen

  • Ich kann das Suchobjekt serializable machen und speichere sie in Ansichtszustand. Dann beim Laden der Seite konnte ich es packen und die Steuer Sammlung an Ladezeit rekonstruieren. Aber ich bin nicht sicher, ob dies gut mit Kontrollen erhöhen Ereignisse spielen würde, und was passiert mit dem Ansichtszustand Drop-Down-Listen, die Daten aus der Datenbank enthalten - konnte ich es zurück? Es ist höchst unerwünscht, für mich zu haben, erneut die Datenbank abfragen auf jedem Postback.

  • Ich kann ein benutzerdefiniertes Server-Steuerelement ( entwickeln, um diesen Link sehen ) für diese Art der Sache ... aber das ist ein neues für mich Thema und würde etwas Lernen beteiligen, und ich bin mir nicht ganz sicher, ob eine benutzerdefinierte Serversteuer mehr gut mit nicht-fester Steuer Sammlungen funktionieren würde. Wer weiß das?

  • Ich dachte, dass ich dies mit Databound-Kontrollen erreichen Möglicherweise kann - zum Beispiel ich mein Kriteriums Sammlung an einen Repeater, der eine feste Steuer Sammlung, die nicht verwendeten „Wert“ Kontrollen (vielleicht verbergen hat binden konnte, verwenden, um eine Inner Repeater für die "Field" Dropdown-Listen). Dann werden alle Informationen würden in Viewstate bleiben ... nicht wahr?

  • Jede neue Ideen sehr geschätzt würde.

Danke für Ihre Hilfe. b.Fandango

War es hilfreich?

Lösung

Ich habe für etwa einen Tag lang Codierung und ich habe diese Arbeit sehr schön die dritte Option ich in meiner Frage vorgeschlagen - Oldschool-Databound-Kontrollen. Eigentlich habe ich nur von der Idee gedacht, als ich gezwungen war, die Frage im Detail zu schreiben - nicht, dass nur dir passieren die ganze Zeit

Ich habe meine SearchCriterionControl in ein asp: Repeater und band es an meine Objektsammlung. Für die Feldauswahl habe ich einen asp: Dropdownlist in einem verschachtelten asp: Repeater und band das Field Array darauf. Alles funktioniert wunderbar, hält Zustand tatsächlich benötigt sehr wenig Code. So hatte ich nie dynamisch Steuerelemente zur Seite hinzufügen, Gott sei Dank.

Vielen Dank für Ihre Anregungen, Ender, Matt und andrewWinn.

Andere Tipps

Da sonst niemand einen Stich an dieser für 2 Stunden in Anspruch genommen hat, ich werde meinen Hut in den Ring mit einer Lösung werfen, die gar nicht auf Ansichtszustand angewiesen ist (oder das ASP.NET-Modell von Postbacks).

Was ist, wenn Sie alle Eingabewerte mit jQuery gepackt und stattdessen eine Post zurück tat einen Beitrag gegen die Seite (oder eine neue results.aspx Seite) zu tun? Oder könnten Sie die ganze Sache asyncrhonous machen und eine Ajax-Anfrage gegen eine Web-Methode tun, erhalten die Ergebnisse zugeführt und füllen auf der Client-Seite nach Bedarf?

Die unglückliche Sache hier ist, dass Sie rekonstruieren müssen, welche Art von Kontrollen wurden verwendet, um Ihre Suchabfrage auf Figur konstruieren, da diese Daten werden nicht mit dem Ansichtszustand übergeben werden. Aber ich denke, Sie wollten sowieso schon eine Art von Übersetzung Ihrer Eingabedaten in eine Abfragemaske zu tun haben.

Lesen Sie hier für weitere Informationen über jQuery eine ASP.NET-Seite Methode zu treffen. Denken Sie daran -. Seite Methoden müssen statisch sein (es ist eine einfache Überwachung)

Ich bin mir nicht sicher, was Sie Server-Seite tun Ihre Abfrage zu konstruieren - aber ich würde hoch LINQ empfehlen. Ich habe eine ähnliche „erweiterte Suche“ -Funktion zuvor, und nach einem paar verschiedenen Versuchen festgestellt, dass LINQ ein wunderbares Werkzeug für dieses Problem war, unabhängig davon, ob ich SQL mit LINQtoSQL schlagen oder einfach nur eine In-Memory-Sammlung von Objekten zu treffen.

Das funktionierte so gut, weil 1) LINQ Ausführung verzögert wird und 2) Eine LINQ-Abfrage gibt ein anderes Objekt abfragbar. Die Implikation ist, dass Sie können Kette Ihre LINQ-Abfragen zusammen, wie Sie sie von Ihrem Eingang konstruieren, statt mit einer einzigen massiven Klausel Übersetzung SQL oder was auch immer backs Sie verwenden (einer meiner Versuche zu tun, wurde mit Streichern SQL-Klauseln Konstruktion, aber immer noch Eingangsdaten über SqlParameters für SQL-Injection-Schutz vorbei -. es war chaotisch und kompliziert, wenn handgearbeiteten LINQ waren Grßenordnungen leichter zu verstehen und zu implementieren)

Zum Beispiel:

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

Durch verzögerte Ausführung und die abfragbaren Rückgabetyp, können Sie LINQ-Abfragen zu diesem Ausdruck den ganzen Tag verketten und lassen Sie es über die Implementierungsdetails kümmern (wie in einer SQL-Abfrage Umwandlung) zur Ausführungszeit.

Ich kann Sie nicht die genauen Schritte, die Sie tun müssen, aber ich sehr empfehlen asp.net Seite Lebenszyklus eines Blick in. Ich habe eine Benutzersteuerung als DLL einmal. Ich hatte Postbacks Daten zu bestimmten Schritten im Lebenszyklus zu erfassen und neu erstellen und die Daten mit anderen Schritten erneut binden. Zusätzlich thinkgs wie Ansichtszustand sind nur an bestimmten Punkten ebenfalls zur Verfügung. Ich weiß, dass ich hatte On_init, On_prerender und einige andere Methoden außer Kraft zu setzen.

Leider kann ich nicht mehr helfen, aber ich habe den Code nicht mit mir (sein mit einem alten Arbeitgeber). Ich hoffe, das hilft.

und

Wenn Sie dynamisch Steuerelemente an den Kontrollen Baum hinzufügen, müssen Sie sie auf postpack hinzuzufügen. Rufen Sie die Methode für die Kontrolle auf Page_Load oder Page_Init und die Kontrollen sollten bleiben Sie auf der Seite auf Postbacks baut.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top