🚀 Blog Post Create: The Ultimate Step-by-Step Guide

Add/Create Blog Post āĻĢāĻŋāϚāĻžāϰāϟāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻŽā§‚āϞ āĻšā§āϝāĻžāϞ⧇āĻžā§āϜ āĻšāϞ⧋ āύāϤ⧁āύ āĻĄāĻžāϟāĻž āϏ⧇āĻ­ āĻ•āϰāĻžāϰ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ Many-to-Many Relationship (āĻ•ā§āϝāĻžāϟāĻžāĻ—āϰāĻŋāϗ⧁āϞ⧋) āϏāĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇ āχāύāϏāĻžāĻ°ā§āϟ āĻ•āϰāĻžāĨ¤

āύāĻŋāĻšā§‡ āφāĻĒāύāĻžāϰ āĻĒā§āϰāĻœā§‡āĻ•ā§āĻŸā§‡āϰ āφāϞ⧋āϕ⧇ Create Blog Post-āĻāϰ āĻāĻ•āϟāĻŋ āĻ•āĻŽāĻĒā§āϞāĻŋāϟ “Master Guide” āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϞ⧋āĨ¤


ā§§. āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ (ASP.NET Core / EF Core) āϞāϜāĻŋāĻ•

āĻ•ā§āϰāĻŋāϝāĻŧ⧇āϟ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āφāĻŽāĻžāĻĻ⧇āϰ āĻ•āĻžāϜ āĻšāϞ⧋ āĻĢā§āϰāĻ¨ā§āϟāĻāĻ¨ā§āĻĄ āĻĨ⧇āϕ⧇ āφāϏāĻž Guid āφāχāĻĄāĻŋāϰ āϞāĻŋāĻ¸ā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϜāĻžāĻ‚āĻļāύ āĻŸā§‡āĻŦāĻŋāϞ (BlogPostCategory) āϏāĻš āĻŽā§‡āχāύ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟāϟāĻŋ āϏ⧇āĻ­ āĻ•āϰāĻžāĨ¤

C#

public async Task<BlogPost> CreateAsync(BlogPost blogPost)
{
    // ā§§. āĻŽā§‡āχāύ BlogPost āĻ…āĻŦāĻœā§‡āĻ•ā§āϟāϟāĻŋ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻŸā§āĻ°ā§āϝāĻžāĻ•āĻŋāĻ‚āϝāĻŧ⧇ āĻ…ā§āϝāĻžāĻĄ āĻ•āϰāĻž
    await dbContext.BlogPosts.AddAsync(blogPost);
    
    // ⧍. āϏ⧇āĻ­ āĻšā§‡āĻžā§āĻœā§‡āϏ āĻ•āϞ āĻ•āϰāĻž (āĻāϟāĻŋ āϜāĻžāĻ‚āĻļāύ āĻŸā§‡āĻŦāĻŋāϞāϏāĻš āϏāĻŦ āĻĄāĻžāϟāĻž āχāύāϏāĻžāĻ°ā§āϟ āĻ•āϰāĻŦ⧇)
    await dbContext.SaveChangesAsync();
    
    return blogPost;
}

āύ⧋āϟ: āφāĻĒāύāĻžāϰ BlogPost āĻŽāĻĄā§‡āϞ⧇āϰ āϭ⧇āϤāϰ⧇ āϝāĻĻāĻŋ public ICollection<Category> Categories { get; set; } āĻĨāĻžāϕ⧇, āϤāĻŦ⧇ EF Core āĻ…āĻŸā§‹āĻŽā§‡āϟāĻŋāĻ• āĻĄāĻžāϟāĻž āχāύāϏāĻžāĻ°ā§āϟ āĻ•āϰ⧇ āĻĻ⧇āĻŦ⧇āĨ¤


⧍. āĻĢā§āϰāĻ¨ā§āϟāĻāĻ¨ā§āĻĄ (Angular) – āĻĢāĻ°ā§āĻŽ āĻ“ āĻĄāĻžāϟāĻž āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞāĻŋāĻ‚

āύāϤ⧁āύ āĻĒā§‹āĻ¸ā§āϟ āĻ•ā§āϰāĻŋāϝāĻŧ⧇āϟ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āφāĻŽāĻžāĻĻ⧇āϰ āĻāĻ•āϟāĻŋ āĻĢāĻžāρāĻ•āĻž āĻĢāĻ°ā§āĻŽ āϞāĻžāĻ—āĻŦ⧇ āĻāĻŦāĻ‚ āχāωāϜāĻžāϰ āϝ⧇ āĻ•ā§āϝāĻžāϟāĻžāĻ—āϰāĻŋāϗ⧁āϞ⧋ āϏāĻŋāϞ⧇āĻ•ā§āϟ āĻ•āϰāĻŦ⧇ āϏ⧇āϗ⧁āϞ⧋ āĻāĻ•āϟāĻŋ āĻ…ā§āϝāĻžāϰ⧇āϤ⧇ āϜāĻŽāĻž āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤

āĻŽā§‚āϞ āϟ⧁āϞāϏ: ReactiveFormsModule, signal(), push(), āĻāĻŦāĻ‚ filter()āĨ¤

TypeScript

// ā§§. āϏāĻŋāϞ⧇āĻ•ā§āϟ āĻ•āϰāĻž āφāχāĻĄāĻŋāϗ⧁āϞ⧋ āϰāĻžāĻ–āĻžāϰ āϜāĻ¨ā§āϝ āĻ…ā§āϝāĻžāϰ⧇
selectedCategoryIds: string[] = [];
isSubmitting = signal(false);

// ⧍. āϰāĻŋāĻ…ā§āϝāĻžāĻ•ā§āϟāĻŋāĻ­ āĻĢāĻ°ā§āĻŽ āϏ⧇āϟāφāĻĒ
addBlogPostForm = new FormGroup({
  title: new FormControl('', Validators.required),
  content: new FormControl('', Validators.required),
  urlHandle: new FormControl('', Validators.required),
  featuredImgUrl: new FormControl('', Validators.required),
  author: new FormControl('', Validators.required),
  publishedDate: new FormControl('', Validators.required),
  isVisible: new FormControl(true)
});

// ā§Š. āϏāĻžāĻŦāĻŽāĻŋāϟ āĻŽā§‡āĻĨāĻĄ
onSubmit() {
  if (this.addBlogPostForm.valid) {
    this.isSubmitting.set(true);
    
    const request = {
      ...this.addBlogPostForm.value,
      // āφāĻŽāĻžāĻĻ⧇āϰ āϏāĻŋāϞ⧇āĻ•ā§āϟ āĻ•āϰāĻž āĻ•ā§āϝāĻžāϟāĻžāĻ—āϰāĻŋāϗ⧁āϞ⧋ āϰāĻŋāϕ⧋āϝāĻŧ⧇āĻ¸ā§āĻŸā§‡ āϝ⧋āĻ— āĻ•āϰāĻž
      categories: this.selectedCategoryIds 
    };

    this.blogPostService.createBlogPost(request).subscribe({
      next: (response) => {
        this.router.navigate(['/admin/blogposts']);
      },
      error: (err) => this.isSubmitting.set(false)
    });
  }
}

ā§Š. āĻāχāϚāϟāĻŋāĻāĻŽāĻāϞ (HTML) – āĻŽāĻžāĻ˛ā§āϟāĻŋ-āϏāĻŋāϞ⧇āĻ•ā§āϟ āĻ•ā§āϝāĻžāϟāĻžāĻ—āϰāĻŋ

āχāωāϜāĻžāϰāϕ⧇ āϏāĻŦ āĻ•ā§āϝāĻžāϟāĻžāĻ—āϰāĻŋ āĻĻ⧇āĻ–āĻžāĻŦā§‹ āĻāĻŦāĻ‚ āϏ⧇ āϝ⧇āϗ⧁āϞ⧋ āϟāĻŋāĻ• āĻĻ⧇āĻŦ⧇ āϏ⧇āϗ⧁āϞ⧋ āφāĻŽāĻžāĻĻ⧇āϰ āϞāĻŋāĻ¸ā§āĻŸā§‡ āϝ⧋āĻ— āĻšāĻŦ⧇āĨ¤

HTML

<label class="form-label fw-bold">Select Categories</label>
<div class="d-flex flex-wrap gap-2">
  @for (category of categoryList(); track category.id) {
    <div class="form-check">
      <input class="form-check-input" 
             type="checkbox" 
             [id]="category.id" 
             [value]="category.id" 
             (change)="onCategoryChange($event)">
      <label class="form-check-label" [for]="category.id">
        {{ category.name }}
      </label>
    </div>
  }
</div>

ā§Ē. āϰāĻŋāϞ⧇āĻļāύāĻļāĻŋāĻĒ āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞāĻŋāĻ‚ (onCategoryChange)

āχāωāϜāĻžāϰ āϝāĻ–āύ āϟāĻŋāĻ• āĻĻ⧇āϝāĻŧ āϤāĻ–āύ push āφāϰ āϟāĻŋāĻ• āϤ⧁āϞ⧇ āĻĻāĻŋāϞ⧇ filter āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āφāχāĻĄāĻŋ āĻŽā§āϝāĻžāύ⧇āϜ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

TypeScript

onCategoryChange(event: Event) {
  const element = event.target as HTMLInputElement;
  const categoryId = element.value;

  if (element.checked) {
    // ā§§. āϞāĻŋāĻ¸ā§āĻŸā§‡ āύāϤ⧁āύ āφāχāĻĄāĻŋ āϝ⧋āĻ— āĻ•āϰāĻž
    this.selectedCategoryIds.push(categoryId);
  } else {
    // ⧍. āϞāĻŋāĻ¸ā§āϟ āĻĨ⧇āϕ⧇ āφāχāĻĄāĻŋ āϏāϰāĻŋāϝāĻŧ⧇ āĻĢ⧇āϞāĻž (āĻ›āĻžāρāϕ⧁āύāĻŋ)
    this.selectedCategoryIds = this.selectedCategoryIds.filter(id => id !== categoryId);
  }
}

ā§Ģ. āϏāĻžāĻŽāĻžāϰāĻŋ āĻšā§‡āĻ•-āϞāĻŋāĻ¸ā§āϟ (āϰāĻŋāĻ­āĻŋāĻļāύ āύ⧋āϟ)

āĻĢāĻŋāϚāĻžāϰāĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻŽā§‡āĻĨāĻĄ/āϟ⧁āϞāϏāϕ⧇āύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞāĻžāĻŽ?
Form ManagementFormGroupāϏāĻŦ āχāύāĻĒ⧁āϟ āĻĄāĻžāϟāĻž āĻāĻ•āϏāĻžāĻĨ⧇ āĻ­ā§āϝāĻžāϞāĻŋāĻĄā§‡āĻļāύāϏāĻš āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞ āĻ•āϰāϤ⧇āĨ¤
Data Collection.push()āχāωāϜāĻžāϰ āϝāĻ–āύ āϕ⧋āύ⧋ āĻ•ā§āϝāĻžāϟāĻžāĻ—āϰāĻŋ āϏāĻŋāϞ⧇āĻ•ā§āϟ āĻ•āϰ⧇ āϤāĻž āϞāĻŋāĻ¸ā§āĻŸā§‡ āϜāĻŽāĻž āĻ•āϰāϤ⧇āĨ¤
Data Removal.filter()āχāωāϜāĻžāϰ āϭ⧁āϞ āĻ•āϰ⧇ āϏāĻŋāϞ⧇āĻ•ā§āϟ āĻ•āϰāϞ⧇ āĻŦāĻž āφāύ-āĻšā§‡āĻ• āĻ•āϰāϞ⧇ āϤāĻž āϞāĻŋāĻ¸ā§āϟ āĻĨ⧇āϕ⧇ āϏāϰāĻžāϤ⧇āĨ¤
UI Interaction(change)āĻšā§‡āĻ•āĻŦāĻ•ā§āϏ⧇ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰāĻžāϰ āϏāĻžāĻĨ⧇ āϏāĻžāĻĨ⧇ āϞāϜāĻŋāĻ• āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻ•āϰāϤ⧇āĨ¤
Loading Statesignal(false)āĻŦāĻžāϟāύ āϞ⧋āĻĄāĻŋāĻ‚ āĻāĻŦāĻ‚ āĻĄāĻžāĻŦāϞ āϏāĻžāĻŦāĻŽāĻŋāĻļāύ āĻŦāĻ¨ā§āϧ āĻ•āϰāϤ⧇āĨ¤

💡 āĻāĻ•ā§āϏāĻĒāĻžāĻ°ā§āϟ āϟāĻŋāĻĒāϏ (revise āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ):

  • Create āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻĢāĻ°ā§āĻŽ āĻĨāĻžāϕ⧇ Empty, āϤāĻžāχ āĻāĻ–āĻžāύ⧇ patchValue āĻŦāĻž effect āĻāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāϝāĻŧ āύāĻž (āϝāĻĻāĻŋ āύāĻž āφāĻĒāύāĻŋ āϕ⧋āύ⧋ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻ­ā§āϝāĻžāϞ⧁ āϚāĻžāύ)āĨ¤
  • Relationship āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āϏāĻŦāϏāĻŽāϝāĻŧ āĻŽāύ⧇ āϰāĻžāĻ–āĻŦ⧇āĻ¨â€” āĻĢā§āϰāĻ¨ā§āϟāĻāĻ¨ā§āĻĄ āĻĨ⧇āϕ⧇ āĻļ⧁āϧ⧁ ID-āĻāϰ āĻāĻ•āϟāĻŋ āϞāĻŋāĻ¸ā§āϟ āĻĒāĻžāĻ āĻžāϞ⧇āχ āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄā§‡ āϰāĻŋāϞ⧇āĻļāύ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āϏāĻŽā§āĻ­āĻŦāĨ¤
  • āϏāĻžāĻŦāĻŽāĻŋāϟ āĻ•āϰāĻžāϰ āφāϗ⧇ this.addBlogPostForm.valid āĻšā§‡āĻ• āĻ•āϰāĻž āĻŽāĻžāĻ¸ā§āϟ, āϝāĻžāϤ⧇ āϭ⧁āϞ āĻĄāĻžāϟāĻž āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āύāĻž āϝāĻžāϝāĻŧāĨ¤

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top