Write.cshtml.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using SharedKernel.Extensions;
  2. using Application.Abstractions.Messaging;
  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.Faq.List;
  9. public class WriteModel(IMediator mediator) : PageModel
  10. {
  11. public string? QueryString { get; set; }
  12. public List<SelectListItem> Categories { get; set; } = [];
  13. [BindProperty]
  14. public InputModel Input { get; set; } = new();
  15. public sealed class InputModel
  16. {
  17. [DisplayName("FAQ 분류")]
  18. [Required(ErrorMessage = "{0}는 필수입니다.")]
  19. public int CategoryID { get; set; }
  20. [DisplayName("질문")]
  21. [DataType(DataType.Text)]
  22. [Required(ErrorMessage = "{0}는 필수입니다.")]
  23. [StringLength(255, ErrorMessage = "{0}은 {1}자 이하로 입력하세요.")]
  24. public string Question { get; set; } = default!;
  25. [DisplayName("답변")]
  26. [DataType(DataType.Html)]
  27. public string? Answer { get; set; }
  28. [DisplayName("순서")]
  29. [Range(-9999, 9999, ErrorMessage = "{0}은 {1}에서 {2} 사이의 값이어야 합니다.")]
  30. public short Order { get; set; } = 0;
  31. [DisplayName("사용 여부")]
  32. public bool IsActive { get; set; } = false;
  33. }
  34. public async Task OnGetAsync(int? categoryID, CancellationToken ct)
  35. {
  36. QueryString = HttpContext.Request.QueryString.HasValue ? HttpContext.Request.QueryString.Value!.TrimStart('?') : "";
  37. Categories = (await mediator.Send(new GetFaqCategories.Query(), ct)).List
  38. .Select(c => new SelectListItem
  39. {
  40. Value = c.ID.ToString(),
  41. Text = $"[{c.Code}] {c.Subject}",
  42. Selected = categoryID.HasValue && c.ID == categoryID.Value
  43. })
  44. .ToList();
  45. if (categoryID.HasValue)
  46. {
  47. Input.CategoryID = categoryID.Value;
  48. }
  49. }
  50. public async Task<IActionResult> OnPostAsync(CancellationToken ct)
  51. {
  52. try
  53. {
  54. if (!ModelState.IsValid)
  55. {
  56. throw new Exception(ModelState.GetErrorMessages());
  57. }
  58. var command = new CreateFaqItem.Command(
  59. Input.CategoryID,
  60. Input.Question,
  61. Input.Answer,
  62. Input.Order,
  63. Input.IsActive
  64. );
  65. await mediator.Send(command, ct);
  66. TempData["SuccessMessage"] = $"{Input.Question} FAQ가 등록되었습니다.";
  67. return RedirectToPage("/Faq/List/Index");
  68. }
  69. catch (Exception e)
  70. {
  71. TempData["ErrorMessages"] = e.Message;
  72. return Redirect($"/Faq/List/Write?{QueryString}");
  73. }
  74. }
  75. }