2013-05-14 14 views
6

Mam dwie listy rozwijane w moim module.Zdobądź listę na podstawie danych rozwijanych list w asp.net mvc3

W jednym dropdownlist, mam ustalony wszystkich operatorów jak <,>,<=,>=,==

W drugim dropdownlist, mam ustalony wynagrodzenia pracowników jak 1000,2000,3000,4000....50000

Teraz, jeśli wybiorę < z jednej listy i 2000 z drugiej listy i kliknij przycisk Prześlij powinienem dostać listę pracowników, którzy mają pensję mniej niż 2000.

chcę to zrobić w asp.net mvc3

Jak mogę wykonać to zadanie?

Czy muszę napisać procedurę przechowywaną w tym celu?

Czy ktoś może mi pomóc?

Stworzyłem DropDownList jak:

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" }, 
           . 
           . 
            }; 

i użyłem to, aby pokazać dropdownlist w widoku:

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

proszę pokazać html generowane dla dwóch dropdownLists. –

+1

i przy okazji, używasz EF, tak myślę? –

+0

Czy jest to zadowalające pytanie? Tak, używam struktury podmiotu –

Odpowiedz

6

dobrze, można zrobić coś takiego

zakładając viewModel jest ... Twój viewModel, a masz podmiot Employee z usługą Salary (int w tej próbce, to chyba decimal w realnym świecie)

utworzyć statyczną klasę pomocniczą

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); 
     } 
} 

użytkowaniu

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

Althaus: Dziękuję za odpowiedź. Zrozumiałem o słowniku dla operatorów, ale nie wiedziałem o statycznej klasie FilterSalry, którą zasugerowałeś. czy możesz mi wyjaśnić coś na temat tej klasy? –

+0

@ K2_Ketu well, metoda rozszerzenia 'Where' przyjmuje parametr' Wyrażenie > '. Metoda polega na budowaniu tego wyrażenia, przekształcaniu go w lambdę i przekazywaniu do metody Where. Możesz spróbować debugować i zobaczyć, co jest w "ciele" krok po kroku i/lub google dla drzew wyrażeń. Dodam także komentarz do mojego kodu. –

+0

@ K2_Ketu i FilterSalary nie jest klasą, tylko statyczną metodą rozszerzenia, taką jak ... 'Where' –

Powiązane problemy