2010-08-31 11 views
8

Tüm metin tabanlı aramalar için özel bir filtre şablonu uygulamaya çalışıyorum ve soruyu oluşturan sorunlara yol açmaya çalışıyorum. BenASP.NET Dinamik Veri TextSearch Özel Filtre Şablonu

WHERE columnAttribute LIKE '%something%' 

sorgu gerçekleştirmek için GetQueryable yöntemini değiştirmek nasıl emin this blog yayınlanan talimatlar ancak takip ediyorum. Blogdaki örnekte, ifade, girilen metin veritabanı sütunundaki metne tam olarak uyuyorsa çalışan bir eşitliktir.

Şu anda SearchExpression denetimi ile birlikte yeni QueryExtender özelliğini kullanıyorum ancak bu, metin arama işlevselliğine gereksinim duyduğum tüm tablolar için birkaç özel sayfa oluşturulmasını gerektiriyor. Özel filtre şablonunu oluşturarak bunu DRY yapmak istiyorum. Herhangi bir yardım büyük takdir edilecektir.

cevap

10

Aşağıda, LIKE operatörünün çevresinde bir filter template nasıl oluşturabileceğinize dair bir örnek verilmiştir. Bu örnek için, özel filtre şablonumuza "Metin" adını vereceğiz.

İlk adım, Dynamic Data metadata güncelleştirmektir. Eğer şöyle FilterUIHintAttribute ile ilgili arama yapabilmek isteyen tüm sütunları alıntı yapma:

[FilterUIHint("Text")] 

Şimdi "Metin" filtre şablonu oluşturmak gerekiyor. Filtre şablonları klasöründe Text.ascx kullanıcı kontrolü (genellikle "~/DynamicData/Filtreler") oluşturun:

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

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

Sonraki geride kodu oluşturmak 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); 
    } 
} 

Metin filtresini güncelledikten sonra kullanıcının sayfayı geri göndermesine (ve dolayısıyla sonuçları güncellemesine) hiçbir şekilde yer vermediğimize dikkat edin. Tarz olarak, otomatik geri bildirimin kafa karıştırıcı olduğu TextBox kontrollerini buluyorum ve her bir filtreyi geri yüklemek için ayrı bir düğmeye sahip olmanın gereksiz olduğunu düşünüyorum. Bunun yerine, kullanıcının sayfayı geri göndermesine ve sonuçları güncellemesine olanak veren sayfa şablonuna (örneğin, "~/DynamicData/PageTemplates/List.aspx") tek bir Düğme eklemeyi seviyorum. İşte ilgili alıntı:

Bunun için hepsi var. Kullanıcılar artık belirtilen sütunlarda metin parçaları içeren kayıtları arayabilmelidir.

+0

Filtreler güncellemek için UpdateFilter düğmesi ne yapar? Bu düğmeyi uyguladığımda, üzerine tıkladığımda hiçbir şey yapmaz. – jpierson

+0

@jpierson Tüm tuşlar, sayfa geri göndermeye neden oluyor. Geri gönderme işleminin sayfa ömrü boyunca, 'TextBox1_Changed', gerçekten filtrelerin bir güncelleştirmesini tetikleyen ateşlemelidir. Sorun yaşıyorsanız, 'TextBox1_Changed''in aslında çağrıldığını doğrulamanız gerekir. –

-2

Filtreleme ve arama işlemlerini yürütmek için jQuery'yi kullanmaya çalıştınız mı?

Here, jQuery ve ASP.NET ile verilerin nasıl filtreleneceğini ve sıralanacağını gösteren harika bir öğreticidir. LINQ to SQL'de, Strings.Contains yöntemi, LIKE işlecini nasıl ifade ettiğnizdir.