7
votes

Conseils pour la construction d'une "recherche avancée" dynamique dans ASP.NET

Texte alt http://img3.imageshack.us/img3/1488/advancedSearch. png

Je construis une interface "Recherche avancée" dans une application ASP.NET. Je n'ai pas besoin pour que je puisse écrire cette chose pour moi, mais je suis coincé sur un problème spécifique concernant les contrôles dynamiques et la vision. Je voudrais une certaine direction pour comment aborder cela. Voici ma situation:

Ingrédients:


3 commentaires

C'est un excellent post et j'essaie de construire presque le même type de page de recherche. Souhaitez-vous partager des exemples de votre travail initial, à savoir créer, "un ensemble d'objets d'API répartis représentant des entités, des champs et des recherches, qui gère la construction d'une recherche, générant SQL et renvoyer les résultats". Si vous avez des liens, ou des informations à partager, il serait très utile, juste concerné, je ne veux pas réinventer la roue s'il y a déjà des libs / frameworks qui font ce genre de chose. Merci, pour le grand post!


Russds, je travaille sur un ensemble logiciel d'entreprise de taille moyenne qui possède ses propres métadonnées (entités et champs) et implémentations de recherche. Je ne suis pas capable de partager aucun du code source de mon employeur avec vous, même si je suis sûr qu'ils ne vous dérangeraient pas si j'ai écrit sur la conception et la mise en œuvre de cette partie du système. Cependant, je pense qu'il existe un certain nombre de bibliothèques de classes de base "d'objet" et de telles personnes qui peuvent vous donner ces types de fonctionnalités. Je vais voir ce que je peux trouver pour vous, mais je recommande un rapide Google de votre côté aussi.


Merci Barry. J'ai fait des googles, mais pas exactement quoi de Google, j'ai essayé des choses comme "UI de recherche dynamique" et "Recherche avancée ASP.NET", rien de concret ne se lève. Votre description est exactement ce que je recherche, quels types de termes serai-je à la recherche? Merci!


4 Réponses :


2
votes

Puisque personne d'autre n'a pris de poitaille à cela pendant 2 heures, je vais lancer mon chapeau dans la bague avec une solution qui ne s'appuie pas sur la vision du tout (ou le modèle ASP.NET de post-planps).

Et si vous avez attrapé toutes les valeurs d'entrée avec jQuery et au lieu de faire un post-arrière, un message est-il contre la page (ou une nouvelle page de résultats.aspx)? Ou, vous pouvez faire tout ce qui est asyncronné et faire une demande Ajax contre une méthode Web, obtenir les résultats et renseigner sur le côté du client au besoin? P>

La chose malheureuse ici est que vous devez reconstruire lequel Les types de commandes ont été utilisés pour comprendre la construction de votre requête de recherche car ces données ne seront pas transmises auprès de la vue. Mais j'imagine que vous alliez déjà avoir à faire une sorte de traduction de vos données d'entrée dans une forme de requête quand même. P>

lire ici Pour plus d'informations sur l'utilisation de jQuery pour appuyer sur une méthode ASP.NET. N'oubliez pas que les méthodes de page doivent être statiques (c'est une surveillance facile). P>

Je ne sais pas ce que vous faites du côté serveur pour construire votre requête - mais je le ferais em> recommandez Linq. J'ai déjà fait une fonction similaire «Recherche avancée» précédemment, et après quelques tentatives différentes constatées que Linq était un outil merveilleux pour ce problème, que je puisse frapper SQL avec Linqtosql ou simplement frapper une collecte en mémoire d'objets. P>

Ceci fonctionnait si bien car 1) LINQ est différé Exécution et 2) une requête LINQ renvoie un autre objet requis. L'implication ici est que vous pouvez chaîner vos requêtes de Linq ensemble lorsque vous les construisez à partir de votre contribution, au lieu de devoir effectuer une seule clause massive, une traduction de SQL ou quelle que soit votre backstore que vous utilisez (une de mes tentatives consistait à construire des clauses SQL avec des chaînes, Mais toujours en passant des données d'entrée via SQLParameters pour la protection injection SQL - c'était désordonné et compliqué lorsque la linq fabriqué à la main était des ordres de grandeur plus faciles à comprendre et à mettre en œuvre). p>

Par exemple: P>

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


5 commentaires

Commentant ma propre réponse ici parce que cela n'est pas pertinent pour la question / la réponse, et est très déposée - mais c'est l'une des raisons pour lesquelles j'ai abandonné ASP.NET en faveur de ASP.NET MVC. Le protocole HTTP n'est pas d'état indiquant et le modèle ASP.NET de ViewState n'est vraiment qu'un singe-patch pour obtenir l'état sur une application Web. Et en tant que tel, vous rencontrez ces types de problèmes. Bien qu'il puisse y avoir une vraie solution ASP.NET/POSTBACK, la complexité impliquée commence à l'emporter sur les avantages. Après tout, vous essayez simplement d'envoyer des données sur le serveur! Devrait être facile comme une tarte.


Merci d'avoir pris le temps d'expliquer tout ce Matt. Bien que cela esquisse mon problème spécifique avec ViewState, il le fait en écartant toute l'approche et en introduisant un certain nombre de nouveaux défis. C'est un peu "Tout ressemble à un clou quand tout ce que tu as est un marteau" Solution - quelque chose que je vois sur tellement avec jQuery pour une raison quelconque.


Merci également aux conseils de l'API et du côté DB, je sais que ce n'est pas lié à la question, mais j'apprécie l'audition d'un autre point de vue sur le sujet.


@barry, compréhensible. C'est pourquoi je me suis tenu jusqu'à ce que j'ai remarqué après 2 heures, vous n'avez toujours pas de réponses. De toute évidence, il existe de multiples façons d'accomplir le même objectif, de mieux que d'autres, et cela varie même par la personne. Quant à JQuery - son Popoluar dans de nombreuses communautés en ligne, mais particulièrement dans .NET, car Microsoft l'expédie en fait dans le cadre de VS2008. Vous remarquerez si vous créez un nouveau projet Web (au moins j'ai fait dans ASP.NET MVC) que le dossier JavaScript a déjà JQuery.


Je sais que nous obtenons de tels sujettes Matt, mais c'est assez génial hein? Pour la MS pour cueillir un cadre JS Best de race de la nature, indépendamment de sa licence et l'intégrant à quelque chose comme le produit MVC est vraiment incroyable de voir.



2
votes

Je ne peux pas vous fournir les étapes exactes que vous devrez faire, mais je suggère fortement à regarder dans le cycle de vie de la page ASP.NET. J'ai créé un contrôle utilisateur en tant que DLL une fois. Je devais capturer des données de publication à des étapes spécifiques dans le cycle de vie et recréer et reculer les données à d'autres étapes. De plus, les Thinkgs comme Viewstate ne sont disponibles que à certains points également. Je sais que je devais remplacer sur_init, on_prerender et quelques autres méthodes.

Désolé, je ne pouvais pas être plus d'aide, mais je n'ai pas le code avec moi (c'est avec un ancien employeur). J'espère que cela vous aidera.


0 commentaires

2
votes

Si vous ajoutez de manière dynamique à l'arborescence des commandes, vous devez également les ajouter sur Postpack. Appelez simplement la méthode qui construit le contrôle sur page_Load ou page_Init et les contrôles doivent rester sur la page sur le post-plan.


0 commentaires

4
votes

J'ai codé environ une journée et je l'ai bien travaillé avec une troisième option que j'ai suggérée dans ma question - Contrôles de données de la vieille école. En fait, j'ai seulement pensé à l'idée quand j'ai été obligé d'écrire la question en détail - ne vous arrive-t-elle que tout le temps?

J'ai mis ma rechercheCrèrionControl dans un ASP: répéteur et lié à ma collection d'objets. Pour le choix de champ, j'ai mis une ASP: Dropdownlist à l'intérieur d'une ASP imbriquée: répéteur et lié la matrice de champ à cela. Tout fonctionne magnifiquement, garde l'état, réellement nécessaire très peu de code. Donc, je n'ai jamais eu à ajouter de manière dynamique des contrôles à la page, merci de Dieu.

Merci pour vos suggestions, Ender, Matt et Andrewwinn.


0 commentaires