Как с помощью ASP.NET MVC3 WebGrid настроить сортировку столбцов таким образом, чтобы щелчок по заголовку столбца переключался между сортировкой по возрастанию и сортировкой по убыванию?
Спасибо!
Роб
Как с помощью ASP.NET MVC3 WebGrid настроить сортировку столбцов таким образом, чтобы щелчок по заголовку столбца переключался между сортировкой по возрастанию и сортировкой по убыванию?
Спасибо!
Роб
Основная проблема оказалась в неправильно сформированном столбце. Имя столбца на самом деле не соответствовало фактическому имени столбца (оно было задано как текст заголовка). Эта проблема была скрыта, поскольку в формате указан Html.ActionLink.
Изменение определения столбца таким образом, чтобы имя столбца было правильным (и для заголовка было задано фактическое значение заголовка), устранило проблему.
Примечание 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>
Надеюсь, это поможет. Дайте мне знать, если вам нужна дополнительная помощь! Я горжусь тем, что могу помочь (если смогу)
Ура!