using SharedKernel.Extensions; using Application.Abstractions.Messaging; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using System.ComponentModel; using System.ComponentModel.DataAnnotations; namespace Admin.Pages.NavMenu; public class WriteModel(IMediator mediator) : PageModel { [BindProperty] public InputModel Input { get; set; } = new(); public sealed class InputModel { [DisplayName("메뉴 명")] [DataType(DataType.Text)] [Required(ErrorMessage = "{0}은(는) 필수입니다.")] [StringLength(50, ErrorMessage = "{0}은(는) {1}자 이하로 입력하세요.")] public string Label { get; set; } = null!; [DisplayName("링크 주소")] [DataType(DataType.Text)] [Required(ErrorMessage = "{0}은(는) 필수입니다.")] [StringLength(200, ErrorMessage = "{0}은(는) {1}자 이하로 입력하세요.")] public string Href { get; set; } = null!; [DisplayName("순서")] [Required(ErrorMessage = "{0}은(는) 필수입니다.")] [Range(0, 9999, ErrorMessage = "{0} 값의 범위는 {1} ~ {2} 입니다.")] public int SortOrder { get; set; } = 0; [DisplayName("노출 여부")] public bool IsVisible { get; set; } = true; } public void OnGet() { } public async Task OnPostAsync(CancellationToken ct) { if (!ModelState.IsValid) { TempData["ErrorMessages"] = ModelState.GetErrorMessages(); return Redirect("/NavMenu/Write"); } var result = await mediator.Send(new Application.Features.Admin.NavMenu.Create.Command( Input.Label, Input.Href, Input.SortOrder, Input.IsVisible ), ct); if (result.IsFailure) { TempData["ErrorMessages"] = result.Error.Description; return Redirect("/NavMenu/Write"); } TempData["SuccessMessage"] = $"{Input.Label} 메뉴가 등록되었습니다."; return RedirectToPage("/NavMenu/Index"); } }