Viewmodel pour permettre le tri et le filtrage de la grille de contrib mvc
-
30-09-2019 - |
Question
Dans ma tentative pour activer le tri et le filtrage conjointement avec le MVC contrib. Je grille ai décidé d'utiliser un viewmodel qui contient les données de la grille ainsi que les informations de tri et de filtrage. J'ajouté une forme sous la grille et la viewmodel est utilisée pour maintenir l'état de la forme et de transporter les données de la grille:
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));
}
}
Le formulaire est créée en utilisant HTMLHelpers et en faisant passer dans le viewmodel.
Le viewmodel est créé dans une méthode de service comme celui-ci (pas complète):
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;
}
Cela fonctionne, mais ne se sent pas bien encore ...
Je me demande si ce code pourrait être amélioré - quelqu'un a fait quelque chose de similaire? Tous les commentaires serait très apprécié. Un grand merci à l'avance.
Les meilleurs voeux,
Christian
La solution
La chose la plus proche à une réponse peut être trouvée ici (proposée par: Sergey Prokhorenko):
http://sprokhorenko.blogspot.com/2009/ 12 / dédié à mon-wife.html
Il est spécifique jqGrid mais m'a donné quelques idées.
Christian