2010-08-31 19 views
8

Estoy tratando de implementar una plantilla de filtro personalizada para todas las búsquedas basadas en texto y tener problemas para construir la consulta. He estado siguiendo las instrucciones publicadas en this blog pero no sabe cómo cambiar el método GetQueryable para realizar una consultaPlantilla de filtro personalizado de datos dinámicos de Text Search de ASP.NET

WHERE columnAttribute LIKE '%something%' 

. En el ejemplo del blog, la expresión es una igualdad que funciona si el texto que ingreso coincide exactamente con el texto en la columna de la base de datos.

Por el momento estoy usando la nueva característica QueryExtender junto con el control SearchExpression, pero esto requiere la creación de varias páginas personalizadas para todas las tablas para las que necesito funcionalidad de búsqueda de texto. Me gustaría SECAR esto creando la plantilla de filtro personalizado. Cualquier ayuda sería muy apreciada.

Respuesta

10

En LINQ to SQL, el método Strings.Contains es cómo se expresa el operador LIKE. Lo que sigue es un ejemplo de cómo puede compilar un filter template alrededor del operador LIKE. Para este ejemplo, le daremos a nuestra plantilla de filtro personalizada el nombre "Texto". El primer paso es actualizar el Dynamic Data metadata. Anotar todas las columnas que desea ser capaz de buscar en la FilterUIHintAttribute así:

[FilterUIHint("Text")] 

Ahora tenemos que crear la plantilla de filtro de "texto". Crear el control de Text.ascx usuario en la carpeta de plantillas de filtro (habitualmente "~/DynamicData/Filtros"):

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

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

A continuación, cree el código subyacente, 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); 
    } 
} 

Observe que no hemos proporcionado ninguna forma para que el usuario registre la página (y, por lo tanto, actualice los resultados) después de actualizar el filtro de texto. Como cuestión de estilo, me parece que TextBox controla esa devolución automática de mensajes para que sea confusa, y considero que es redundante tener un botón por separado para devolver cada filtro individual. En cambio, me gusta agregar un solo botón a la plantilla de la página (por ejemplo, "~/DynamicData/PageTemplates/List.aspx") que permite al usuario realizar una devolución de la página y actualizar los resultados. Aquí está el extracto relevante:

<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> 

Eso es todo lo que hay que hacer. Los usuarios ahora deberían poder buscar registros que contengan fragmentos de texto en las columnas especificadas.

+0

¿Qué hace el botón UpdateFilter para que los filtros se actualicen? Cuando implemento este botón, simplemente no hace nada cuando hago clic en él. – jpierson

+0

@jpierson Todo lo que hace el botón es causar una devolución de página de la página. Durante el ciclo de vida de la página de la devolución de datos, debe activarse 'TextBox1_Changed', que es lo que realmente desencadena una actualización de los filtros. Si tiene problemas, debe verificar que realmente se está llamando a 'TextBox1_Changed'. –

-2

¿Ha intentado utilizar jQuery para manejar el filtrado y la búsqueda?

Here es un excelente tutorial que le muestra cómo filtrar y ordenar datos con jQuery y ASP.NET.

Cuestiones relacionadas