2010-09-03 2 views
0

В моей попытке включить сортировку и фильтрацию в сочетании с MVC contrib. grid Я решил использовать Viewmodel, который содержит данные сетки, а также информацию о сортировке и фильтрации. Я добавил форму под сеткой и ViewModel используется для поддержания состояния формы и для переноса данных для сетки:Viewmodel, чтобы разрешить сортировку и фильтрацию для сетки mvc contrib

public class GridViewModel<T> 
    { 
     public int Page {get; set;} // current page of grid 
     public string OrderBy {get; set;} // name of the column 
     public bool Asc {get; set;} 
     public string Operation {get; set;} // SW - Startswith, C - Contains 
     public string Column {get; set;} // name of the column where operation takes place 
     public string Argument {get; set;} // argument for operation 
     public int RowsPerPage {get; set;} // visible number of rows per page 

     public List<T> Data {get; set;} 

     public GridViewModel(List<T> Data) 
     { 
      this.Data = Data; 
     } 
     public GridViewModel() 
     { 
      Page = 1; 
      Asc = true; 
      RowsPerPage = 10; 
      Argument = ""; 
     } 

     public int getNumberofPages() 
     { 
      return (int) Math.Ceiling(Convert.ToDouble(Data.Count)/Convert.ToDouble(RowsPerPage)); 
     } 
    } 

Форма создается с помощью HTMLHelpers и путем передачи в ViewModel.

модели представления создается в методе обслуживания, как это (не полный):

public GridViewModel<Bla> GetGridData(GridViewModel<Bla> GridViewModel) 
     { 
      IOrderedEnumerable<Bla> list = GetAllBlas(); 

      string Argument = GridViewModel.Argument.Trim(); 
      switch (GridViewModel.Column) 
      { 
       case "Age": 
        switch (GridViewModel.Operation) 
        { 
         case "SW": 
          list = list.Where(c => c.Age.ToString().StartsWith(Argument)).OrderBy(c => c.ProposalDateTime); 
          break; 
         case "C": 
          list = list.Where(c => c.Age.ToString().Contains(Argument)).OrderBy(c => c.ProposalDateTime); 
          break; 
         default: 
          break; 
        } 
        break; 

       default: 
        break; 
      } 

      int start_index = (GridViewModel.RowsPerPage * GridViewModel.Page) - GridViewModel.RowsPerPage; 

      switch (GridViewModel.OrderBy) 
      { 
       case "Age": 
        list = GridViewModel.Asc == true ? list.OrderBy(c => c.Age) : list.OrderByDescending(c => c.Age); 
        break; 
       case "ProposalDateTime": 
        list = GridViewModel.Asc == true ? list.OrderBy(c => c.ProposalDateTime) : list.OrderByDescending(c => c.ProposalDateTime); 
        break; 
       case "UpdateDateTime": 
        list = GridViewModel.Asc == true ? list.OrderBy(c => c.UpdateDateTime) : list.OrderByDescending(c => c.UpdateDateTime); 
        break; 
       default: 
        list = GridViewModel.Asc == true ? list.OrderBy(c => c.ProposalDateTime) : list.OrderByDescending(c => c.ProposalDateTime); 
        break; 
      } 

      int number_of_rows = list.Count(); 
      if (start_index > number_of_rows) 
      { 
       start_index = 0; 
      } 

      GridViewModel.Data = list.Skip<Bla>((int)start_index).Take<Bla>((int)GridViewModel.RowsPerPage).ToList(); 

      return GridViewModel; 
     } 

Это работает, но не чувствует себя хорошо еще ...

Я просто интересно, может ли быть этот код улучшено - кто-то сделал что-то подобное? Любая обратная связь будет очень оценена. Спасибо заранее.

С наилучшими пожеланиями,

Christian

ответ

Смежные вопросы