Edit.cshtml.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. using SharedKernel.Attributes;
  2. using SharedKernel.Extensions;
  3. using Application.Abstractions.Messaging;
  4. using Microsoft.AspNetCore.Mvc;
  5. using Microsoft.AspNetCore.Mvc.RazorPages;
  6. using Microsoft.AspNetCore.Mvc.Rendering;
  7. using System.ComponentModel;
  8. using System.ComponentModel.DataAnnotations;
  9. namespace Admin.Pages.Banner.List;
  10. public class EditModel(IMediator mediator) : PageModel
  11. {
  12. [BindProperty]
  13. public string? QueryString { get; set; }
  14. public List<SelectListItem> Positions { get; set; } = [];
  15. public string? CurrentDesktopImage { get; private set; }
  16. public string? CurrentMobileImage { get; private set; }
  17. [BindProperty]
  18. public InputModel Input { get; set; } = new();
  19. public sealed class InputModel
  20. {
  21. [DisplayName("ID")]
  22. [Required(ErrorMessage = "{0}은(는) 필수입니다.")]
  23. public int ID { get; set; }
  24. [DisplayName("배너 위치 ID")]
  25. [Required(ErrorMessage = "{0}은(는) 필수입니다.")]
  26. public int PositionID { get; set; }
  27. [DisplayName("배너 명")]
  28. [DataType(DataType.Text)]
  29. [Required(ErrorMessage = "{0}은(는) 필수입니다.")]
  30. [StringLength(255, ErrorMessage = "{0}은(는) {1}자 이하로 입력하세요.")]
  31. public string Subject { get; set; } = null!;
  32. [DisplayName("첨부 이미지(Desktop)")]
  33. [AllowedExtensions("jpg,jpeg,png,gif,webp", ErrorMessage = "이미지 형식은 jpg, jpeg, png, gif, webp 만 허용합니다.")]
  34. public IFormFile? DesktopImageFile { get; set; }
  35. [DisplayName("첨부 이미지(Mobile)")]
  36. [AllowedExtensions("jpg,jpeg,png,gif,webp", ErrorMessage = "이미지 형식은 jpg, jpeg, png, gif, webp 만 허용합니다.")]
  37. public IFormFile? MobileImageFile { get; set; }
  38. [DisplayName("Desktop 이미지 삭제")]
  39. public bool RemoveDesktopImage { get; set; } = false;
  40. [DisplayName("Mobile 이미지 삭제")]
  41. public bool RemoveMobileImage { get; set; } = false;
  42. [DisplayName("링크 주소")]
  43. [DataType(DataType.Url)]
  44. [StringLength(255, ErrorMessage = "{0}은(는) {1}자 이하로 입력하세요.")]
  45. public string? Link { get; set; }
  46. [DisplayName("링크 타겟")]
  47. [RegularExpression("^(_self|_blank)$", ErrorMessage = "{0} 값은 _self 또는 _blank만 허용합니다.")]
  48. public string LinkTarget { get; set; } = "_self";
  49. [DisplayName("순서")]
  50. [Required(ErrorMessage = "{0}은(는) 필수입니다.")]
  51. [Range(-9999, 9999, ErrorMessage = "{0} 값의 범위는 {2} ~ {1} 입니다.")]
  52. public short Order { get; set; } = 0;
  53. [DisplayName("사용 여부")]
  54. public bool IsActive { get; set; } = false;
  55. [DisplayName("노출 기간 - 시작")]
  56. [DataType(DataType.DateTime)]
  57. public DateTime? StartAt { get; set; }
  58. [DisplayName("노출 기간 - 종료")]
  59. [DataType(DataType.DateTime)]
  60. public DateTime? EndAt { get; set; }
  61. }
  62. public async Task OnGetAsync(int id, CancellationToken ct)
  63. {
  64. Positions = [.. (await mediator.Send(new GetBannerPositions.Query(), ct)).List.Select(p => new SelectListItem {
  65. Value = p.ID.ToString(),
  66. Text = $"[{p.Code}] {p.Subject}"
  67. })];
  68. var result = await mediator.Send(new GetBannerItem.Query(id), ct);
  69. if (result.IsFailure)
  70. {
  71. TempData["ErrorMessages"] = result.Error.Description;
  72. QueryString = Request.QueryString.ToString();
  73. return;
  74. }
  75. var data = result.Value;
  76. CurrentDesktopImage = data.DesktopImage;
  77. CurrentMobileImage = data.MobileImage;
  78. Input = new InputModel
  79. {
  80. ID = data.ID,
  81. PositionID = data.PositionID,
  82. Subject = data.Subject,
  83. Link = data.Link,
  84. LinkTarget = data.LinkTarget,
  85. Order = data.Order,
  86. IsActive = data.IsActive,
  87. StartAt = data.StartAt,
  88. EndAt = data.EndAt
  89. };
  90. QueryString = Request.QueryString.ToString();
  91. }
  92. public async Task<IActionResult> OnPostAsync(CancellationToken ct)
  93. {
  94. if (!ModelState.IsValid)
  95. {
  96. TempData["ErrorMessages"] = ModelState.GetErrorMessages();
  97. return Redirect($"/Banner/List/Edit/{Input.ID}{Request.QueryString}");
  98. }
  99. var result = await mediator.Send(new UpdateBannerItem.Command(
  100. Input.ID,
  101. Input.PositionID,
  102. Input.Subject,
  103. Input.DesktopImageFile,
  104. Input.MobileImageFile,
  105. Input.RemoveDesktopImage,
  106. Input.RemoveMobileImage,
  107. Input.Link,
  108. Input.LinkTarget,
  109. Input.Order,
  110. Input.IsActive,
  111. Input.StartAt,
  112. Input.EndAt
  113. ), ct);
  114. if (result.IsFailure)
  115. {
  116. TempData["ErrorMessages"] = result.Error.Description;
  117. }
  118. else
  119. {
  120. TempData["SuccessMessage"] = $"{Input.Subject} 배너가 수정되었습니다.";
  121. }
  122. return Redirect($"/Banner/List/Edit/{Input.ID}{Request.QueryString}");
  123. }
  124. }