2013-05-14 23 views
6

'daki aşağı açılır liste verilerine göre alın. Modemde iki tane dropdownlist var.Listeyi asp.net mvc3

bir dropdownlist, ben ikinci dropdownlist olarak <,>,<=,>=,==

gibi tüm operatörler kodlanmış, ben Şimdi ikinci liste ve itibaren bir listesi ve 2000 den < seçerseniz 1000,2000,3000,4000....50000

gibi çalışanların maaş kodlanmış olan Ben maaş çalışanların listesini almalısınız gönder düğmesi üzerine tıklayın az 2000 ben asp.net MVC3 içinde bunu yapmak istiyor

Bu görevi nasıl gerçekleştirebilirim ???

Bunun için saklı yordam yazmam gerekir mi?

Herkes bana yardımcı olabilir mi ??

ben gibi dropdownlist oluşturduk:

viewModel.OperatorsList = new[] 
           { 
           new SelectListItem { Value = "<", Text = "<" }, 
           new SelectListItem { Value = ">", Text = ">" }, 
           new SelectListItem { Value = "<=", Text = "<=" }, 
           new SelectListItem { Value = ">=", Text = ">=" }, 
           new SelectListItem { Value = "==", Text = "==" } 
                 }; 
    viewModel.SalaryList = new[] 
                 { 
           new SelectListItem { Value = "1000", Text = "1000" }, 
           new SelectListItem { Value = "2000", Text = "2000" }, 
           new SelectListItem { Value = "3000", Text = "3000" }, 
           . 
           . 
            }; 

ve ben görünümünde DropDownList göstermek için bu kullandık: Eğer

viewModel varsayarak yani böyle bir şey yapabileceğini, iyi

<%: Html.DropDownListFor(x => x.Operators, Model.OperatorsList)%> 
+0

oluşturun) gerçek dünyada muhtemelen decimal bu. –

+1

ve bu arada, EF kullanıyorsunuz, sanırım? –

+0

bu ur soruyu tatmin mi bir evet taraf çerçeve –

cevap

6

... viewModel, ve Salary () numaralı bir varlığa sahip bir Employee var. Bu örnekteki, bu

senin iki DropDownLists için oluşturulan html göstermek lütfen statik yardımcı sınıf

public static class MyHelper 
    { 
     // a dictionary for your operators and corresponding ExpressionType 
     public static Dictionary<string, ExpressionType> ExpressionTypeDictionary = new Dictionary<string, ExpressionType> 
     { 
      {"<", ExpressionType.LessThan}, 
      {">", ExpressionType.GreaterThan}, 
      {">=", ExpressionType.GreaterThanOrEqual} 
      //etc 
     }; 
     //a method to filter your queryable 
     public static IQueryable<Employee> FilterSalary(this IQueryable<Employee> queryable, int salary, string operatorType) 
     { 
      //left part of the expression : m 
      var parameter = Expression.Parameter(typeof(Employee), "m"); 
      //body is the right part of the expression : m 
      Expression body = parameter; 
      //m.Salary 
      body = Expression.Property(body, "Salary"); 
      //m.Salary <= 1000 (for example) 
      body = Expression.MakeBinary(ExpressionTypeDictionary[operatorType], body, Expression.Constant(salary)); 
      //m => m.Salary <=1000 
      var lambda = Expression.Lambda<Func<Employee, bool>>(body, new[] { parameter }); 
      //so it will be queryable.Where(m => m.Salary <= 1000) 
      return queryable.Where(lambda); 
     } 
} 

kullanım

var queryable = context.All<Employee>();//or something like that, returning an IQueryable<Employee> 
queryable = queryable.FilterSalary(viewModel.Salary, viewModel.Operators); 
+0

Althaus kullanıyorum:? Teşekkür Cevabınız için. Operatörler için sözlük hakkında anladım ama önerdiğiniz statik sınıf FilterSalry hakkında kafam karıştı. bana bu ders hakkında bir şeyler anlatabilir misin? –

+0

@ K2_Ketu de, uzatma yöntemi 'Where' parametresi olarak 'bir' Expression > alır. Yöntem sadece bu ifadeyi inşa etmekte, onu bir lambdaya dönüştürmekte ve onu Where yöntemine iletmektir. Hata ayıklamayı deneyebilir ve 'vücut' adım adım neler olduğunu ve/veya İfade ağaçları için google'ı görüntüleyebilirsiniz. Koduma da bazı yorumlar ekleyeceğim. –

+0

@ K2_Ketu ve FilterSalary bir sınıf, sadece statik bir uzantısı yöntemi gibi değil ... ' –

İlgili konular