MVC3 WebGrid переключает направление сортировки - PullRequest
1 голос
/ 12 ноября 2011

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

Спасибо!

Rob

Ответы [ 2 ]

2 голосов
/ 13 ноября 2011

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

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

1 голос
/ 26 декабря 2011

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

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

Итак ...

Вотпредставление с конечным результатом для таблицы

Представление по умолчанию http://cognitivegenerationenterprises.net/cgeCorp/Images/Toggling-MVC-Grid/defaultGrid3.png

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

    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 будет нулевым.Однако шаблон ниже демонстрирует, как я выполнил переключение столбца «Фамилия».Кроме того, обратите внимание, что я установил в качестве первого состояния по умолчанию значение «По убыванию».В качестве альтернативы вы можете перевернуть его, если хотите, чтобы Ascending был зарегистрирован в качестве первого состояния, когда пользователь нажимает на ссылку.Для моих целей лучше всего работает «По убыванию».

    @{
         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>

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

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

Ура!

...