Viewmodel per consentire ordinare e filtrare per griglia contrib mvc
-
30-09-2019 - |
Domanda
Nel mio tentativo di consentire l'ordinamento e filtraggio in collaborazione con il contrib MVC. griglia Ho deciso di utilizzare un ViewModel che contiene i dati di griglia più informazioni ordinare e filtrare. Ho aggiunto un modulo sotto la griglia e la ViewModel viene utilizzato per mantenere lo stato del modulo e per trasportare i dati per la griglia:
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));
}
}
La forma viene creata usando HtmlHelpers e passando nel ViewModel.
Il ViewModel viene creato in un metodo di servizio come questo (non completo):
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;
}
Questo funziona, ma non si sente bene ancora ...
Mi chiedo solo se questo codice potrebbe essere migliorato - ha qualcuno fatto qualcosa di simile? Qualsiasi feedback sarà molto apprezzato. Molte grazie in anticipo.
Un caro saluto,
Christian
Soluzione
La cosa più vicina ad una risposta può essere trovata qui (proposto da: Sergey Prokhorenko):
http://sprokhorenko.blogspot.com/2009/ 12 / dedicato-to-my-wife.html
E 'specifico jqGrid ma mi ha fornito alcune idee.
Christian