controller에서 viewModel을 받아 result를 db에서 쿼리해 뿌리는 작업을 하고 있습니다.
page.cshtml의 검색 조건을 변경 후, 페이지를 변경하면 기존 viewModel에서 값만 변경돼 적용되는 것이 아닌 새 viewModel이 생성돼 검색 조건이 사라집니다.
찾아본 예제에서는 asp-route- 태그 or ViewData로 값을 하나하나 지정해 처리하는 방법만 보이는데, 수정된 viewModel을 controller로 넘기거나 WPF의 Dependency Property처럼 값이 변경되는 즉시 result가 변경되게 하는 방법이 있을까요?
ViewModel
[BindProperties]
public class ReviewsPageViewModel
{
public ReviewsPageViewModel()
{
SearchingText = "";
SearchingProperty = ESearchingProperty.ItemName;
OrderBy = EReviewOrderBy.Id;
Page = 1;
Count = 20;
IsAscending = true;
}
[FromQuery]
public string SearchingText { get; set; }
[FromQuery]
public ESearchingProperty SearchingProperty { get; set; }
[FromQuery]
public EReviewOrderBy OrderBy { get; set; }
[FromQuery]
public int Page { get; set; }
[FromQuery]
public int Count { get; set; }
[FromQuery]
public int AllResultCount { get; set; }
[FromQuery]
public bool IsAscending { get; set; }
public int LastPage => AllResultCount % Count == 0 ? AllResultCount / Count : AllResultCount / Count + 1;
public List<ReviewInfo> SearchResult { get; set; }
}
Controller
[HttpGet("[controller]/Page/")]
public async Task<IActionResult> Page(ReviewsPageViewModel viewModel)
{
/*ViewModel의 SearchingText, SearchingProperty,
OrderBy, Page, Count, IsAscending으로 viewModel.SearchResult를 DB에서 쿼리*/
reutrn View(viewModel)
}
Page.cshtml
@model ReviewsPageViewModel
@{
ViewData["Title"] = "Review Page";
string controller = "Reviews";
string action = "Page";
}
<!-- 검색 조건 --!>
<form method="get" asp-controller="@controller" asp-action="@action">
<select asp-for="SearchingProperty">
<option value="@ESearchingProperty.ItemName">리뷰 아이템 이름</option>
<option value="@ESearchingProperty.Title">제목</option>
<option value="@ESearchingProperty.UserName">작성자 이름</option>
</select>
<input type="search" asp-for="SearchingText" />
</form>
<!-- 페이징 --!>
<nav aria-label="Page navigation">
<ul class="pagination justify-content-center">
@{
if (Model.LastPage == 1)
{
<li class="page-item"><a class="page-link" asp-controller="@controller" asp-action="@action" asp-route-page="1">1</a></li>
}
else
{
if (Model.Page != 1)
{
<li class="page-item"><a class="page-link" asp-controller="@controller" asp-action="@action" asp-route-page=@(Model.Page - 1)>Prev</a></li>
}
int startPage = Model.Page - 2 > 0 ? Model.Page - 2 : 1;
int endPage = Model.Page + 10 <= Model.LastPage ? Model.Page + 10 : Model.LastPage;
for (; startPage <= endPage; ++startPage)
{
if (startPage == Model.Page)
{
<li class="page-item active"><a class="page-link" asp-controller="@controller" asp-action="@action" asp-route-page="@startPage">@startPage</a></li>
}
else
{
<li class="page-item"><a class="page-link" asp-controller="@controller" asp-action="@action" asp-route-page="@startPage">@startPage</a></li>
}
}
if (Model.Page != Model.LastPage)
{
<li class="page-item"><a class="page-link" asp-controller="@controller" asp-action="@action" asp-route-page="@(Model.Page + 1)" asp-route-searchingItemName=@Model.SearchingText>Next</a></li>
<li class="page-item"><a class="page-link" asp-controller="@controller" asp-action="@action" asp-route-page="@(Model.LastPage)" asp-route-searchingItemName=@Model.SearchingText>Last</a></li>
}
}
}
</ul>
</nav>