@page "/admin/blog/{id:int}/edit" @attribute [Authorize] @using TaxBaik.Application.DTOs @using TaxBaik.Web.Components.Admin.Pages.Blog @inject IBlogBrowserClient BlogClient @inject ICategoryBrowserClient CategoryClient @inject NavigationManager Navigation @inject ISnackbar Snackbar @inject IDialogService DialogService 포스트 수정 Content 포스트 수정 블로그 포스트를 수정합니다. 취소 @if (isLoading) { } else if (post == null) { 포스트를 찾을 수 없습니다. } else { 삭제 } @code { [Parameter] public int Id { get; set; } private TaxBaik.Application.DTOs.BlogPostResponseDto? post; private IReadOnlyList categories = []; private BlogForm.BlogFormModel model = new(); private bool isLoading = true; protected override async Task OnInitializedAsync() { try { post = await BlogClient.GetByIdAsync(Id); if (post != null) { categories = await CategoryClient.GetAllAsync(); MapPostToModel(post); } } catch (Exception ex) { Snackbar.Add($"포스트 로드 실패: {ex.Message}", Severity.Error); } finally { isLoading = false; } } private void MapPostToModel(TaxBaik.Application.DTOs.BlogPostResponseDto post) { model.Title = post.Title; model.Content = post.Content; model.CategoryId = post.CategoryId; model.Tags = post.Tags; model.SeoTitle = post.SeoTitle; model.SeoDescription = post.SeoDescription; model.IsPublished = post.IsPublished; } private void GoBack() { Navigation.NavigateTo("/taxbaik/admin/blog"); } private async Task SavePost() { if (post == null) return; try { var result = await BlogClient.UpdateAsync(post.Id, new CreateBlogPostDto { Title = model.Title, Content = model.Content, CategoryId = model.CategoryId, Tags = model.Tags, SeoTitle = model.SeoTitle, SeoDescription = model.SeoDescription, IsPublished = model.IsPublished }); if (result == null) { Snackbar.Add("저장 실패: 포스트를 저장하지 못했습니다.", Severity.Error); return; } Snackbar.Add("포스트가 저장되었습니다.", Severity.Success); Navigation.NavigateTo("/taxbaik/admin/blog"); } catch (ValidationException ex) { Snackbar.Add(ex.Message, Severity.Error); } catch (Exception ex) { Snackbar.Add($"저장 실패: {ex.Message}", Severity.Error); } } private async Task DeletePost() { if (post == null) return; var result = await DialogService.ShowMessageBox( "포스트 삭제", "정말 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.", "삭제", "취소"); if (result != true) return; try { var deleted = await BlogClient.DeleteAsync(post.Id); if (!deleted) { Snackbar.Add("삭제 실패: 포스트를 삭제하지 못했습니다.", Severity.Error); return; } Snackbar.Add("포스트가 삭제되었습니다.", Severity.Success); Navigation.NavigateTo("/taxbaik/admin/blog"); } catch (Exception ex) { Snackbar.Add($"삭제 실패: {ex.Message}", Severity.Error); } } }