Index.cshtml.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using SharedKernel.Helpers;
  2. using SharedKernel.Extensions;
  3. using MediatR;
  4. using Microsoft.AspNetCore.Mvc;
  5. using Microsoft.AspNetCore.Mvc.RazorPages;
  6. using System.ComponentModel;
  7. using System.ComponentModel.DataAnnotations;
  8. namespace Admin.Pages.Faq.List
  9. {
  10. public class IndexModel(IMediator mediator) : PageModel
  11. {
  12. [BindProperty(SupportsGet = true)]
  13. public QueryParams Query { get; set; } = new();
  14. public List<(int ID, string Code, string Subject, int FaqItemRows)> Categories { get; set; } = [];
  15. public sealed class QueryParams
  16. {
  17. [Range(1, int.MaxValue)]
  18. [DisplayName("페이지 번호")]
  19. public int PageNum { get; set; } = 1;
  20. [Range(1, 100)]
  21. [DisplayName("페이지 목록 수")]
  22. public ushort PerPage { get; set; } = 10;
  23. [DisplayName("FAQ 분류")]
  24. public int? CategoryID { get; set; }
  25. [DisplayName("검색어")]
  26. public string? Keyword { get; set; }
  27. }
  28. public int Total { get; set; } = 0;
  29. public List<(
  30. int Num,
  31. int ID,
  32. string CategoryCode,
  33. string CategorySubject,
  34. string Question,
  35. string? Answer,
  36. short Order,
  37. char IsActive,
  38. string? UpdatedAt,
  39. string CreatedAt,
  40. string EditURL
  41. )> List { get; set; } = [];
  42. public Pagination? Pagination { get; set; }
  43. public async Task OnGetAsync(CancellationToken ct)
  44. {
  45. if (!ModelState.IsValid)
  46. {
  47. return;
  48. }
  49. Categories = [..(await mediator.Send(new GetFaqCategories.Query(), ct)).List.Select(c => (c.ID, c.Code, c.Subject, c.FaqItemRows))];
  50. var result = await mediator.Send(new SearchFaqItems.Query(Query.CategoryID, Query.Keyword, Query.PageNum, Query.PerPage), ct);
  51. var queryString = Query.ToQueryString();
  52. Total = result.Total;
  53. List = [..result.List.Select(c => (
  54. c.Num,
  55. c.ID,
  56. c.CategoryCode,
  57. c.CategorySubject,
  58. c.Question,
  59. c.Answer,
  60. c.Order,
  61. c.IsActive ? 'Y' : 'N',
  62. c.UpdatedAt.GetDateAt() ?? "-",
  63. c.CreatedAt.GetDateAt(),
  64. EditURL: $"/Faq/List/Edit/{c.ID}{Request.QueryString}"
  65. ))];
  66. Pagination = new Pagination(result.Total, Query.PageNum, Query.PerPage);
  67. }
  68. public async Task<IActionResult> OnPostDeleteAsync(int[] ids, CancellationToken ct)
  69. {
  70. try
  71. {
  72. await mediator.Send(new DeleteFaqItem.Command(ids), ct);
  73. TempData["SuccessMessage"] = $"{ids.Length}개 FAQ가 삭제되었습니다.";
  74. }
  75. catch (Exception e)
  76. {
  77. TempData["ErrorMessages"] = e.Message;
  78. }
  79. return RedirectToPage("/Faq/List/Index", Query);
  80. }
  81. }
  82. }