2010-08-31 13 views
8

J'essaie d'implémenter un modèle de filtre personnalisé pour toutes les recherches basées sur du texte et de rencontrer des problèmes lors de la construction de la requête. J'ai suivi les instructions affichées sur this blog mais ne savez pas comment changer la méthode GetQueryable pour effectuer uneModèle de filtre personnalisé ASP.NET Dynamic Data TextSearch

WHERE columnAttribute LIKE '%something%' 

requête. Dans l'exemple sur le blog, l'expression est une égalité qui fonctionne si le texte que je saisis correspond exactement au texte de la colonne de la base de données.

En ce moment j'utilise la nouvelle fonctionnalité QueryExtender avec le contrôle SearchExpression, mais cela nécessite la création de plusieurs pages personnalisées pour toutes les tables dont j'ai besoin d'une fonctionnalité de recherche de texte. Je voudrais sécher ceci en créant le modèle de filtre personnalisé. Toute aide serait grandement appréciée.

Répondre

10

Dans LINQ to SQL, la méthode Strings.Contains exprime l'opérateur LIKE. Ce qui suit est un exemple de la façon dont vous pourriez construire un filter template autour de l'opérateur LIKE. Pour cet exemple, nous donnerons à notre modèle de filtre personnalisé le nom "Texte".

La première étape consiste à mettre à jour le Dynamic Data metadata. Annoter toutes les colonnes que vous voulez être en mesure de rechercher sur le FilterUIHintAttribute comme ceci:

[FilterUIHint("Text")] 

Maintenant, nous devons créer le modèle de filtre « Texte ». Créez le Text.ascx contrôle utilisateur dans le dossier des modèles de filtre (typiquement "~/DynamicData/Filtres"):

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Text.ascx.cs" Inherits="Text" %> 

<asp:TextBox runat="server" ID="TextBox1" autocomplete="off" OnTextChanged="TextBox1_Changed" /> 

Créez ensuite le code derrière, Text.ascx.cs:

public partial class Text : QueryableFilterUserControl { 
    public override Control FilterControl { 
     get { return TextBox1; } 
    } 

    protected void TextBox1_Changed(object sender, EventArgs e) { 
     OnFilterChanged(); 
    } 

    public override IQueryable GetQueryable(IQueryable source) { 
     var value = TextBox1.Text; 
     if (String.IsNullOrWhiteSpace(value)) return source; 

     if (DefaultValues != null) { 
      DefaultValues[Column.Name] = value; 
     } 

     var parameter = Expression.Parameter(source.ElementType); 
     var columnProperty = Expression.PropertyOrField(parameter, Column.Name); 
     var likeValue = Expression.Constant(value, typeof (string)); 
     var condition = Expression.Call(
      columnProperty, 
      typeof (string).GetMethod("Contains"), 
      likeValue); 
     var where = Expression.Call(
      typeof (Queryable), 
      "Where", 
      new[] { source.ElementType }, 
      source.Expression, 
      Expression.Lambda(condition, parameter)); 
     return source.Provider.CreateQuery(where); 
    } 
} 

Notez que nous n'avons fourni aucun moyen pour l'utilisateur de publier la page (et donc de mettre à jour les résultats) après la mise à jour du filtre de texte. En ce qui concerne le style, je trouve que les contrôles TextBox que la publication automatique est confuse, et je trouve qu'il est redondant d'avoir un bouton séparé pour publier chaque filtre individuel. Au lieu de cela, j'aime ajouter un seul bouton au modèle de page (par exemple, "~/DynamicData/PageTemplates/List.aspx") qui permet à l'utilisateur de publier la page et mettre à jour les résultats. Voici l'extrait pertinent:

<asp:Panel runat="server" DefaultButton="UpdateFilter"> 
    <asp:QueryableFilterRepeater runat="server" ID="FilterRepeater"> 
     <ItemTemplate> 
      <asp:Label runat="server" Text='<%# Eval("DisplayName") %>' OnPreRender="Label_PreRender" /> 
      <asp:DynamicFilter runat="server" ID="DynamicFilter" OnFilterChanged="DynamicFilter_FilterChanged" /><br /> 
     </ItemTemplate> 
    </asp:QueryableFilterRepeater> 
    <asp:Button runat="server" ID="UpdateFilter" Text="Search" /> 
</asp:Panel> 

C'est tout ce qu'il y a à faire. Les utilisateurs devraient maintenant pouvoir rechercher des enregistrements contenant des fragments de texte dans les colonnes spécifiées.

+0

Que fait le bouton UpdateFilter pour mettre à jour les filtres? Lorsque j'implémente ce bouton, il ne fait rien quand je clique dessus. – jpierson

+0

@jpierson Tout le bouton provoque une publication de page. Pendant le cycle de vie de la page de la publication, 'TextBox1_Changed' devrait se déclencher, ce qui déclenche une mise à jour des filtres. Si vous rencontrez des problèmes, vous devez vérifier que 'TextBox1_Changed' est réellement appelé. –

-2

Avez-vous essayé d'utiliser jQuery pour gérer le filtrage et la recherche?

Here est un excellent tutoriel qui vous montre comment filtrer et trier les données avec jQuery et ASP.NET.