[번역] 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
}
&nbsp; | &nbsp;
@if (ViewBag.CurrentFilter != "NewReleases")
{
@Html.ActionLink("New Releases", "Index", new {
filter = "NewReleases", sortOrder =
ViewBag.CurrentSortOrder })
}
else
{
@:New Releases
}
&nbsp; | &nbsp;
@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("&nbsp;");

@Html.ActionLink("< Prev", "Index", new {
page
= Model.PageNumber - 1,
sortOrder
= ViewBag.CurrentSortOrder,
filter = ViewBag.CurrentFilter })
}
else
{
@:<< First
@Html.Raw("&nbsp;");
@:< Prev
}
&nbsp;&nbsp;
@if (Model.HasNextPage)
{
@Html.ActionLink("Next
>", "Index", new {
page = Model.PageNumber + 1,
sortOrder = ViewBag.CurrentSortOrder,
filter = ViewBag.CurrentFilter })

@Html.Raw("&nbsp;");

@Html.ActionLink("Last >>", "Index", new {
page = Model.PageCount,
sortOrder = ViewBag.CurrentSortOrder,
filter = ViewBag.CurrentFilter })
}
else
{
@:Next >
@Html.Raw("&nbsp;")
@:Last >>
}
</p>

그런 다음 Books Controller에서 Index() 메서드를 수정합니다.새로운 필터 변수를 받아들이면 사용자가 선택한 필터에 따라 책 목록의 수를 줄일 수 있습니다.다음과 같은 두 가지 방법이 있습니다.
Linq에 Where 문자열 선택 기준을 추가합니다
4
  • 표준 Linq의 강력한 유형 선택 조건을 사용합니다

  • 보통 선별기는 항목을 많이 포함하지 않기 때문에 이 비결에서 우리는 두 번째 방법을 사용할 것이다.두 번째 방법을 사용할 때 항목은 미리 만들어진 것이고 강한 유형이기 때문에 동적이지 않기 때문에 추가 입력 검사나 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일 동안 발표된 책을 검색할 수 있고, 또한 사용자는 곧 발표된 책을 검색하여 오늘 출판된 모든 책을 되돌릴 수 있다.그렇지 않으면, 어떤 필터도 선택하지 않으면 모든 책을 되돌려줍니다.
    참고 자료
    원서 주소 책 원본 코드

    좋은 웹페이지 즐겨찾기