Viewmodel, чтобы разрешить сортировку и фильтрацию для сетки MVC - PullRequest
0 голосов
/ 03 сентября 2010

В моей попытке включить сортировку и фильтрацию вместе с MVC contrib. Сетка Я решил использовать 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.

Модель представления создается с помощью метода обслуживания, подобного этому (не завершенного):

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;
        }

Это работает, но пока не чувствует себя хорошо ...

Мне просто интересно, можно ли улучшить этот код - кто-то сделал что-то подобное? Любая обратная связь будет очень ценится. Большое спасибо заранее.

С наилучшими пожеланиями,

Christian

1 Ответ

0 голосов
/ 06 октября 2010

Ближайшая вещь к ответу может быть найдена здесь (предложено: Сергей Прохоренко):

http://sprokhorenko.blogspot.com/2009/12/dedicated-to-my-wife.html

Это специфично для jqgrid, но дало мне некоторые идеи.

Christian

...