첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

■ BindPropertyAttribute 클래스의 SupportsGet 속성을 사용하는 방법을 보여준다.

TestProject.zip
다운로드

▶ Pages/Movies/Index.cshtml

@page
@using TestProject.Models
@model TestProject.Pages.Movies.IndexModel
@{
    ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
    <a asp-page="Create">Create New</a>
</p>
<form>
    <p>
        <select asp-for="MovieGenre" asp-items="Model.GenreSelectList">
            <option value="">All</option>
        </select>
        Title : <input type="text" asp-for="SearchString" />
        <input type="submit" value="Filter" />
    </p>
</form>
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.MovieList[0].Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.MovieList[0].ReleaseDate)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.MovieList[0].Genre)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.MovieList[0].Price)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach(Movie movie in Model.MovieList)
{
        <tr>
            <td>
                @Html.DisplayFor(modelItem => movie.Title)
            </td>
            <td>
                @Html.DisplayFor(modelItem => movie.ReleaseDate)
            </td>
            <td>
                @Html.DisplayFor(modelItem => movie.Genre)
            </td>
            <td>
                @Html.DisplayFor(modelItem => movie.Price)
            </td>
            <td>
                <a asp-page="./Edit" asp-route-id="@movie.ID">Edit</a> |
                <a asp-page="./Details" asp-route-id="@movie.ID">Details</a> |
                <a asp-page="./Delete" asp-route-id="@movie.ID">Delete</a>
            </td>
        </tr>
}
    </tbody>
</table>

 

▶ Pages/Movies/Index.cshtml.cs

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

using TestProject.Data;
using TestProject.Models;

namespace TestProject.Pages.Movies
{
    /// <summary>
    /// 인덱스 모델
    /// </summary>
    public class IndexModel : PageModel
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 컨텍스트
        /// </summary>
        private readonly DatabaseContext context;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 영화 리스트 - MovieList

        /// <summary>
        /// 영화 리스트
        /// </summary>
        public IList<Movie> MovieList { get;set; }

        #endregion

        #region 검색 문자열 - SearchString

        /// <summary>
        /// 검색 문자열
        /// </summary>
        [BindProperty(SupportsGet = true)]
        public string SearchString { get; set; }

        #endregion
        #region 장르 선택 리스트 - GenreSelectList

        /// <summary>
        /// 장르 선택 리스트
        /// </summary>
        public SelectList GenreSelectList { get; set; }

        #endregion
        #region 영화 장르 - MovieGenre

        /// <summary>
        /// 영화 장르
        /// </summary>
        [BindProperty(SupportsGet = true)]
        public string MovieGenre { get; set; }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - IndexModel(context)

        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="context">컨텍스트</param>
        public IndexModel(DatabaseContext context)
        {
            this.context = context;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region GET 비동기 처리하기 - OnGetAsync()

        /// <summary>
        /// GET 비동기 처리하기
        /// </summary>
        /// <returns>태스크</returns>
        public async Task OnGetAsync()
        {
            var genreQueryable = from movie in this.context.Movie
                                 orderby movie.Genre
                                 select  movie.Genre;

            var movieQueryable = from movie in this.context.Movie
                                 select movie;

            if(!string.IsNullOrEmpty(SearchString))
            {
                movieQueryable = movieQueryable.Where(s => s.Title.Contains(SearchString));
            }

            if(!string.IsNullOrEmpty(MovieGenre))
            {
                movieQueryable = movieQueryable.Where(x => x.Genre == MovieGenre);
            }

            GenreSelectList = new SelectList(await genreQueryable.Distinct().ToListAsync());

            MovieList = await movieQueryable.ToListAsync();
        }

        #endregion
    }
}

 

※ TestDB 데이터베이스 생성

 

1. 비주얼 스튜디오를 실행한다.
2. 비주얼 스튜디오에서 [보기] / [SQL Server 개체 탐색기] 메뉴를 클릭한다.
3. [SQL Server 개체 탐색기]에서 [SQL Server] / [(localdb)MSSQLLocalDB...] / [데이터베이스] 노드 위에서 마우스 오른쪽 버튼을 클릭한다.
4. 컨텍스트 메뉴에서 [새 데이터베이스 추가] 메뉴를 클릭한다.
5. [데이터베이스 만들기] 대화 상자에서 아래와 같이 입력하고 [확인] 버튼을 클릭한다.

 

 

6. 비주얼 스튜디오에서 [도구] / [NuGet 패키지 관리자] / [패키지 관리자 콘솔] 메뉴를 클릭한다.
7. [패키지 관리자 콘솔]에서 아래 명령을 실행한다.

 

▶ 실행 명령

Update-Database
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요