سؤال

في محاولتي لتمكين الفرز والتصفية بالتزامن مع مساهمة 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 محدد ولكنه زودني ببعض الأفكار.

مسيحي

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top