В моей попытке включить сортировку и фильтрацию вместе с MVC contrib. Сетка Я решил использовать Viewmodel, которая содержит данные сетки плюс сортировку и фильтрацию информации. Я добавил форму под сеткой, и Viewmodel используется для поддержания состояния формы и для переноса данных для сетки:
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