Ansichtsmodell zu ermöglichen, Sortieren und Filtern für MSL Contrib grid
-
30-09-2019 - |
Frage
In meinem Versuch zu ermöglichen, Sortieren und Filtern in Verbindung mit dem MVC contrib. Gitter I haben beschlossen, eine Ansichtsmodell zu verwenden, die die Rasterdaten plus die Sortier- und Filterinformationen enthält. Ich habe ein Formular unter dem Gitter und das Ansichtsmodell verwendet wird, um den Zustand der Form zu halten und die Daten für das Netz zu tragen:
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));
}
}
Das Formular erstellt wird HtmlHelpers und im Ansichtsmodell vorbei.
Das Ansichtsmodell wird in einer Service-Methode wie folgt erstellt (nicht vollständig):
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;
}
Das funktioniert aber fühlt sich nicht richtig noch ...
Ich frage mich, ob dieser Code verbessert werden könnte - hat jemand etwas ähnliches getan? Jedes Feedback würde sehr geschätzt. Vielen Dank im Voraus.
Mit freundlichen Grüßen
Christian
Lösung
Die nächste Sache, eine Antwort finden Sie hier (Vorschlag: Sergey Prochorenko):
http://sprokhorenko.blogspot.com/2009/ 12 / dedicated-to-my-wife.html
Es jqGrid spezifisch ist, aber mich mit ein paar Ideen zur Verfügung gestellt.
Christian