ViewModel للسماح للفرز والتصفية لشبكة Contrib MVC
-
30-09-2019 - |
سؤال
في محاولتي لتمكين الفرز والتصفية بالتزامن مع مساهمة MVC. الشبكة لقد قررت استخدام عرض 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.
يتم إنشاء 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;
}
هذا يعمل ولكنه لا يشعر بالراحة بعد ...
أنا فقط أتساءل عما إذا كان يمكن تحسين هذا الرمز - هل قام شخص ما بشيء مماثل؟ أي ردود الفعل سيكون موضع تقدير كبير. شكرا كثيرا مسبقا.
أطيب التمنيات،
مسيحي
المحلول
يمكن العثور على أقرب شيء إلى إجابة هنا (اقترحه: سيرجي بروكورينكو):
http://sprokhorenko.blogspot.com/2009/12/dedicated-to-my-wife.html
إنه JQGrid محدد ولكنه زودني ببعض الأفكار.
مسيحي