[번역] ASP.NET MVC 3 개발의 20가지 노하우 (9) [20 Recipes for Programming MVC 3]: 목록을 선별
16101 단어 programming
정렬과 페이지 나누기가 사용자가 원하는 결과를 찾을 수 있도록 도와주지 못하면 조건에 따라 내용을 선별하는 방식으로 찾을 수 있도록 도와줍니다.
솔루션
새로운 링크를 추가하면 사용자가 미리 만들어진 표준 내용을 선택하여 Linq Library를 통해 목록 내용을 데이터로 선별할 수 있습니다.
토론
필터 링크를 추가하려면 Books 뷰, Index 뷰 및 BookController 컨트롤러를 수정해야 합니다.수정은 사용자가 선택할 수 있는 컨텐트여야 하는 HTML 링크를 추가하는 이전 두 가지 팁과 유사합니다.세 개의 새 링크를 추가합니다: 모두, 새로 발표하고 곧 발표합니다.새로 발표된 내용은 최근 2주 동안 발표된 내용이다.곧 발표될 내용은 향후 발표를 예고하는 내용이다.
다음은 새로운 북스 및 Index 보기입니다.세 개의 링크에는 현재 사용자의 정렬 옵션을 유지하기 위한 정렬 규칙의 매개 변수가 포함되어 있으며, 두 개의 링크에는 'Filter' 라는 새로운 변수 매개 변수가 포함되어 있습니다.페이지 링크와 마찬가지로 활성화된 필터는 링크만 표시하고 활성화되지 않은 디스플레이 텍스트 링크는 사용자가 현재 선택한 필터 옵션을 표시합니다.사용자가 정렬 옵션을 변경할 때 현재 필터의 옵션을 유지하기 위해서도 현재 필터에 따라 업데이트해야 합니다.
@model PagedList.IPagedList<MvcApplication4.Models.Book>
<h2>@MvcApplication4.Resources.Resource1.BookIndexTitle</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<p>
Show:
@if (ViewBag.CurrentFilter != "")
{
@Html.ActionLink("All", "Index", new {
sortOrder = ViewBag.CurrentSortOrder })
}
else
{
@:All
}
|
@if (ViewBag.CurrentFilter != "NewReleases")
{
@Html.ActionLink("New Releases", "Index", new {
filter = "NewReleases", sortOrder =
ViewBag.CurrentSortOrder })
}
else
{
@:New Releases
}
|
@if (ViewBag.CurrentFilter != "ComingSoon")
{
@Html.ActionLink("Coming Soon", "Index", new {
filter = "ComingSoon", sortOrder =
ViewBag.CurrentSortOrder })
}
else
{
@:Coming Soon
}
</p>
@Html.Partial("_Paging")
<table>
<tr>
<th>
@Html.ActionLink("Title", "Index", new {
sortOrder = ViewBag.TitleSortParam,
filter = ViewBag.CurrentFilter })
</th>
<th>
@Html.ActionLink("Isbn", "Index", new {
sortOrder = ViewBag.IsbnSortParam,
filter = ViewBag.CurrentFilter })
</th>
<th>
Summary
</th>
<th>
@Html.ActionLink("Author", "Index", new {
sortOrder = ViewBag.AuthorSortParam,
filter = ViewBag.CurrentFilter })
</th>
<th>
Thumbnail
</th>
<th>
@Html.ActionLink("Price", "Index", new {
sortOrder = ViewBag.PriceSortParam,
filter = ViewBag.CurrentFilter })
</th>
<th>
@Html.ActionLink("Published", "Index", new {
sortOrder = ViewBag.PublishedSortParam,
filter = ViewBag.CurrentFilter })
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.Isbn)
</td>
<td>
@Html.DisplayFor(modelItem => item.Summary)
</td>
<td>
@Html.DisplayFor(modelItem => item.Author)
</td>
<td>
@Html.DisplayFor(modelItem => item.Thumbnail)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
@Html.DisplayFor(modelItem => item.Published)
</td>
<td>
@Html.ActionLink("Edit",
"Edit", new { id = item.ID }) |
@Html.ActionLink("Details",
"Details", new { id = item.ID }) |
@Html.ActionLink("Delete",
"Delete", new { id = item.ID })
</td>
</tr>
}
</table>
@Html.Partial("_Paging")
이전에 우리가 만든 페이지 링크의 부분 보기에서도 이러한 수정이 필요합니다.다음 코드에서도 현재 페이지 번호, 정렬 규칙 및 필터 옵션을 네 개의 페이지 링크로 전송해야 합니다.
<p>
@if (Model.HasPreviousPage)
{
@Html.ActionLink("<< First", "Index", new {
page = 1,
sortOrder = ViewBag.CurrentSortOrder,
filter = ViewBag.CurrentFilter })
@Html.Raw(" ");
@Html.ActionLink("< Prev", "Index", new {
page = Model.PageNumber - 1,
sortOrder = ViewBag.CurrentSortOrder,
filter = ViewBag.CurrentFilter })
}
else
{
@:<< First
@Html.Raw(" ");
@:< Prev
}
@if (Model.HasNextPage)
{
@Html.ActionLink("Next >", "Index", new {
page = Model.PageNumber + 1,
sortOrder = ViewBag.CurrentSortOrder,
filter = ViewBag.CurrentFilter })
@Html.Raw(" ");
@Html.ActionLink("Last >>", "Index", new {
page = Model.PageCount,
sortOrder = ViewBag.CurrentSortOrder,
filter = ViewBag.CurrentFilter })
}
else
{
@:Next >
@Html.Raw(" ")
@:Last >>
}
</p>
그런 다음 Books Controller에서 Index() 메서드를 수정합니다.새로운 필터 변수를 받아들이면 사용자가 선택한 필터에 따라 책 목록의 수를 줄일 수 있습니다.다음과 같은 두 가지 방법이 있습니다.
Linq에 Where 문자열 선택 기준을 추가합니다
4
보통 선별기는 항목을 많이 포함하지 않기 때문에 이 비결에서 우리는 두 번째 방법을 사용할 것이다.두 번째 방법을 사용할 때 항목은 미리 만들어진 것이고 강한 유형이기 때문에 동적이지 않기 때문에 추가 입력 검사나 SQL 주입 예방 치료가 필요하지 않다.
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Linq.Dynamic;
using System.Web;
using System.Web.Mvc;
using MvcApplication4.Models;
using MvcApplication4.Utils;
using PagedList;
namespace MvcApplication4.Controllers
{
public class BooksController : Controller
{
private BookDBContext db = new BookDBContext();
//
// GET: /Books/
public ViewResult Index(string sortOrder,
string filter, int page = 1)
{
#region ViewBag Resources
...
#endregion
#region ViewBag Sort Params
...
#endregion
var books = from b in db.Books select b;
#region Filter Switch
switch (filter)
{
case "NewReleases":
var startDate = DateTime.Today.AddDays(-14);
books = books.Where(b => b.Published
<= DateTime.Today.Date
&& b.Published >= startDate
);
break;
case "ComingSoon":
books = books.Where(b => b.Published >
DateTime.Today.Date);
break;
default:
// No filter needed
break;
}
ViewBag.CurrentFilter =
String.IsNullOrEmpty(filter) ? "" : filter;
#endregion
books = books.OrderBy(sortOrder);
int maxRecords = 1;
int currentPage = page - 1;
return View(books.ToPagedList(currentPage,
maxRecords));
}
...
}
}
위의 예에서 사용자는 최신 내용을 선별하여 오늘이나 지난 14일 동안 발표된 책을 검색할 수 있고, 또한 사용자는 곧 발표된 책을 검색하여 오늘 출판된 모든 책을 되돌릴 수 있다.그렇지 않으면, 어떤 필터도 선택하지 않으면 모든 책을 되돌려줍니다.
참고 자료
원서 주소 책 원본 코드