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.
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
@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é. –