Edit.cshtml.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. using SharedKernel.Extensions;
  2. using MediatR;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Microsoft.AspNetCore.Mvc.RazorPages;
  5. using Microsoft.AspNetCore.Mvc.Rendering;
  6. using System.ComponentModel;
  7. using System.ComponentModel.DataAnnotations;
  8. namespace Admin.Pages.Popup;
  9. public class EditModel(IMediator mediator) : PageModel
  10. {
  11. [BindProperty]
  12. public string? QueryString { get; set; }
  13. public List<SelectListItem> Positions { get; private set; } = [];
  14. [BindProperty]
  15. public InputModel Input { get; set; } = new();
  16. public sealed class InputModel
  17. {
  18. [DisplayName("ID")]
  19. [Required(ErrorMessage = "{0}은 필수입니다.")]
  20. public int ID { get; set; }
  21. [DisplayName("위치")]
  22. [Required(ErrorMessage = "{0}은 필수입니다.")]
  23. public int PositionID { get; set; }
  24. [DisplayName("제목")]
  25. [DataType(DataType.Text)]
  26. [Required(ErrorMessage = "{0}은 필수입니다.")]
  27. [StringLength(255, ErrorMessage = "{0}은 {1}자 이하로 입력하세요.")]
  28. public string Subject { get; set; } = default!;
  29. [DisplayName("내용")]
  30. [DataType(DataType.Html)]
  31. [StringLength(4000, ErrorMessage = "{0}은 {1}자 이하로 입력하세요.")]
  32. public string? Content { get; set; }
  33. [DisplayName("주소")]
  34. [DataType(DataType.Url)]
  35. [StringLength(255, ErrorMessage = "{0}은 {1}자 이하로 입력하세요.")]
  36. public string? Link { get; set; }
  37. [DisplayName("시작 일시")]
  38. [DisplayFormat(DataFormatString = "{0:yyyy-MM-ddTHH:mm}", ApplyFormatInEditMode = true)]
  39. public DateTime? StartAt { get; set; }
  40. [DisplayName("종료 일시")]
  41. [DisplayFormat(DataFormatString = "{0:yyyy-MM-ddTHH:mm}", ApplyFormatInEditMode = true)]
  42. public DateTime? EndAt { get; set; }
  43. [DisplayName("순서")]
  44. [Range(-9999, 9999)]
  45. public short Order { get; set; }
  46. [DisplayName("사용 여부")]
  47. public bool IsActive { get; set; }
  48. public string? UpdatedAt { get; set; }
  49. public string CreatedAt { get; set; } = default!;
  50. }
  51. public async Task OnGetAsync(int id, CancellationToken ct)
  52. {
  53. QueryString = HttpContext.Request.QueryString.HasValue ? HttpContext.Request.QueryString.Value!.TrimStart('?') : "";
  54. await LoadPositionsAsync(ct);
  55. var popup = await mediator.Send(new GetPopup.Query(id), ct);
  56. if (popup is null)
  57. {
  58. return;
  59. }
  60. Input.ID = popup.ID;
  61. Input.PositionID = popup.PositionID;
  62. Input.Subject = popup.Subject;
  63. Input.Content = popup.Content;
  64. Input.Link = popup.Link;
  65. Input.StartAt = popup.StartAt;
  66. Input.EndAt = popup.EndAt;
  67. Input.Order = popup.Order;
  68. Input.IsActive = popup.IsActive;
  69. Input.UpdatedAt = popup.UpdatedAt.GetDateAt();
  70. Input.CreatedAt = popup.CreatedAt.GetDateAt();
  71. }
  72. public async Task<IActionResult> OnPostAsync(CancellationToken ct)
  73. {
  74. try
  75. {
  76. if (!ModelState.IsValid)
  77. {
  78. await LoadPositionsAsync(ct);
  79. return Page();
  80. }
  81. var command = new UpdatePopup.Command(
  82. Input.ID,
  83. Input.PositionID,
  84. Input.Subject,
  85. Input.Content,
  86. Input.Link,
  87. Input.StartAt,
  88. Input.EndAt,
  89. Input.Order,
  90. Input.IsActive
  91. );
  92. await mediator.Send(command, ct);
  93. TempData["SuccessMessage"] = $"{Input.Subject} 팝업이 수정되었습니다.";
  94. }
  95. catch (Exception e)
  96. {
  97. TempData["ErrorMessages"] = e.Message;
  98. }
  99. return Redirect($"/Popup/Edit/{Input.ID}?{QueryString}");
  100. }
  101. private async Task LoadPositionsAsync(CancellationToken ct)
  102. {
  103. var result = await mediator.Send(new GetPopupPositions.Query(), ct);
  104. Positions = [..result.List.Select(x => new SelectListItem(
  105. x.Subject,
  106. x.ID.ToString())
  107. )];
  108. }
  109. }