MVC3 WebGrid переключает направление сортировки

Как с помощью ASP.NET MVC3 WebGrid настроить сортировку столбцов таким образом, чтобы щелчок по заголовку столбца переключался между сортировкой по возрастанию и сортировкой по убыванию?

Спасибо!

Роб


person user505765    schedule 12.11.2011    source источник


Ответы (2)


Основная проблема оказалась в неправильно сформированном столбце. Имя столбца на самом деле не соответствовало фактическому имени столбца (оно было задано как текст заголовка). Эта проблема была скрыта, поскольку в формате указан Html.ActionLink.

Изменение определения столбца таким образом, чтобы имя столбца было правильным (и для заголовка было задано фактическое значение заголовка), устранило проблему.

person user505765    schedule 13.11.2011

Примечание 1. Использование синтаксиса Razor для разметки и C# в качестве кода на стороне сервера.

Примечание 2. Базовые сведения о настройке сортировки взяты из Сортировка, фильтрация и разбиение на страницы с помощью Entity Framework Tutorial, но Мне нужно было больше контроля и рычагов, чем они предоставили для своего простого примера.

So...

Вот представление конечного результата для сетки

http://cognitivegenerationenterprises.net/cgeCorp/Images/Toggling-MVC-Grid/defaultGrid3.png

Вот мой код ServerSide в действии Index (поэтому, когда моя страница загружается) (опять же, см. ссылку выше для получения дополнительной справочной информации)

    public ViewResult Index(string sortOrder)
    {
        // Set the defaults 
        ViewBag.FirstNameSortParam = "First Name desc";
        ViewBag.LastNameSortParam = "Last Name desc";
        ViewBag.CitySortParam = "City desc";
        ViewBag.StateSortParam = "State desc";
        ViewBag.DOBSortParam = "DOB desc";

        var students = from s in db.Students select s;

        switch (sortOrder)
        {
            case "First Name desc":
                students = students.OrderByDescending(s => s.FirstName);
                ViewBag.FirstNameSortParam = sortOrder;
                break;
            case "First Name asc":
                students = students.OrderBy(s => s.FirstName);
                ViewBag.FirstNameSortParam = sortOrder;
                break;
            case "Last Name desc":
                students = students.OrderByDescending(s => s.LastName);
                ViewBag.LastNameSortParam = sortOrder;
                break;
            case "Last Name asc":
                students = students.OrderBy(s => s.LastName);
                ViewBag.LastNameSortParam = sortOrder;
                break;
            case "City desc":
                students = students.OrderByDescending(s => s.StudentAddress.City);
                ViewBag.CitySortParam = sortOrder;
                break;
            case "City asc":
                students = students.OrderBy(s => s.StudentAddress.City);
                ViewBag.CitySortParam = sortOrder;
                break;
            case "State desc":
                students = students.OrderByDescending(s => s.StudentAddress.State);
                ViewBag.StateSortParam = sortOrder;
                break;
            case "State asc":
                students = students.OrderBy(s => s.StudentAddress.State);
                ViewBag.StateSortParam = sortOrder;
                break;
            case "DOB desc":
                students = students.OrderByDescending(s => s.DOB);
                ViewBag.DOBSortParam = sortOrder;
                break;
            case "DOB asc":
                students = students.OrderBy(s => s.DOB);
                ViewBag.DOBSortParam = sortOrder;
                break;
            default:
                students = students.OrderByDescending(s => s.StudentID);
                break;
        }

        return View(students.ToList());
    }

При первом запуске, конечно, sortOrder будет нулевым. Однако приведенный ниже шаблон демонстрирует, как я выполнил переключение столбца «Фамилия». Также обратите внимание, что я установил для своего 1-го состояния по умолчанию значение «По убыванию». В качестве альтернативы вы можете перевернуть его, если хотите, чтобы по возрастанию как 1-е состояние регистрировалось, когда пользователь нажимает на ссылку. Для моих целей «По убыванию» работает лучше всего.

    @{
         string fnSort = ViewBag.FirstNameSortParam;
         string lnSort = ViewBag.LastNameSortParam;
         string citySort = ViewBag.CitySortParam;
         string stateSort = ViewBag.StateSortParam;
         string dobSort = ViewBag.DOBSortParam;
     }
  <table>
    <tr>
        <th>
            @{
                if (fnSort != "First Name desc")
                {
                    fnSort = "First Name desc";
                }else{
                    fnSort = "First Name asc";
                }
            }
            @Html.ActionLink("First Name", "Index", new { sortOrder = fnSort })
        </th>
        <th>
            @{
                if (lnSort != "Last Name desc")
                {
                    lnSort = "Last Name desc";
                }else{
                    lnSort = "Last Name asc";
                }
            }

            @Html.ActionLink("Last Name", "Index", new { sortOrder = lnSort })
        </th>
        <th>
            Email
        </th>
        <th>
            Phone Number
        </th>
        <th>
            @{
                if (citySort != "City desc")
                {
                    citySort = "City desc";
                }else{
                    citySort = "City asc";
                }
            }

            @Html.ActionLink("City", "Index", new { sortOrder = citySort })
        </th>
        <th>
            @{
                if (stateSort != "State desc")
                {
                    stateSort = "State desc";
                }else{
                    stateSort = "State asc";
                }
            }

            @Html.ActionLink("State", "Index", new { sortOrder = stateSort })
        </th>
        <th>
            @{
                if (dobSort != "DOB desc")
                {
                    dobSort = "DOB desc";
                }else{
                    dobSort = "DOB asc";
                }
            }

            @Html.ActionLink("DOB", "Index", new { sortOrder = dobSort })
        </th>
        <th></th>
    </tr>

    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.FirstName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.LastName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Email)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.PhoneNumber)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.StudentAddress.City)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.StudentAddress.State)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.DOB)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id=item.StudentID }) |
                @Html.ActionLink("Details", "Details", new { id=item.StudentID }) |
                @Html.ActionLink("Delete", "Delete", new { id=item.StudentID })
            </td>
        </tr>
    }

</table>

Вот и все... Переключение теперь работает для "Фамилии"... теперь я реализую переключение сортировки и для других столбцов

Надеюсь, это поможет. Дайте мне знать, если вам нужна дополнительная помощь! Я горжусь тем, что могу помочь (если смогу)

Ура!

person Robert Green MBA    schedule 26.12.2011