ViewModel, чтобы обеспечить сортировку и фильтрацию для MVC Grid

StackOverflow https://stackoverflow.com/questions/3634199

Вопрос

В моей попытке включить сортировку и фильтрацию в сочетании с MVC вклад. Сетка Я решил использовать ViewModel, который содержит данные сетки плюс информации о сортировке и фильтрации. Я добавил форму под сеткой, а ViewModel используется для поддержания состояния формы и для передачи данных для GRID:

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/ddeded-to-my-wife.html.

Это зависит от JQgrid, но предоставила мне некоторые идеи.

Христианин

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top