ASP.NET Blog and Comment Management
ASP.NET Blog and Comment Management
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
namespace [Link]
{
public class BlogController : Controller
{
private readonly ApplicationDbContext _context;
if (blog == null)
{
return NotFound();
}
return View(blog);
}
_context.Add(blogPost);
await _context.SaveChangesAsync();
if ([Link])
{
try
{
_context.Update(blogPost);
await _context.SaveChangesAsync();
TempData["SuccessMessage"] = "Blog post updated successfully!";
}
catch (DbUpdateConcurrencyException)
{
if (!BlogPostExists([Link]))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
if (blog == null)
{
return NotFound();
}
return View(blog);
}
Comment controller:
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
namespace [Link]
{
public class CommentController : Controller
{
private readonly ApplicationDbContext _context;
_context.[Link](comment);
await _context.SaveChangesAsync();
Home controller
using [Link];
using [Link];
using [Link];
namespace [Link]
{
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
Application Db contest
using [Link];
using [Link];
using [Link];
namespace [Link]
{
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
namespace [Link]
{
public static class SeedData
{
public static async Task Initialize(IServiceProvider serviceProvider)
{
try
{
var userManager =
[Link]<UserManager<ApplicationUser>>();
var roleManager =
[Link]<RoleManager<IdentityRole>>();
var context =
[Link]<ApplicationDbContext>();
// 1. Create Roles
if (!await [Link]("Admin"))
{
await [Link](new IdentityRole("Admin"));
}
if (!await [Link]("User"))
{
await [Link](new IdentityRole("User"));
}
if ([Link])
{
await [Link](admin, "Admin");
await [Link](blogs);
await [Link]();
}
}
private static async Task AddSampleBlogs(ApplicationDbContext context,
string authorId)
{
// Check if blogs already exist
if (![Link]())
{
var blogs = new[]
{
new BlogPost
{
Title = "Welcome to Tech Blog",
Content = "This is our first blog post. Welcome to our tech
blog website!",
Category = "General",
CreatedDate = [Link](-5),
IsPublished = true,
AuthorId = authorId
},
new BlogPost
{
Title = "[Link] Core Tutorial",
Content = "Learn how to build web applications with [Link]
Core.",
Category = "[Link]",
CreatedDate = [Link](-3),
IsPublished = true,
AuthorId = authorId
},
new BlogPost
{
Title = "C# Programming Basics",
Content = "Introduction to C# programming language for
beginners.",
Category = "C#",
CreatedDate = [Link](-1),
IsPublished = true,
AuthorId = authorId
}
};
await [Link](blogs);
await [Link]();
}
}
}
}
Model aaplication user
using [Link];
namespace [Link]
{
public class ApplicationUser : IdentityUser
{
public string FullName { get; set; } = "";
}
}
Blogpost model
namespace [Link]
{
public class BlogPost
{
public int Id { get; set; }
public string Title { get; set; } = "";
public string Content { get; set; } = "";
public string Category { get; set; } = "General";
public DateTime CreatedDate { get; set; } = [Link];
public bool IsPublished { get; set; } = true;
public string AuthorId { get; set; } = "";
}
}
Comment model
namespace [Link]
{
public class Comment
{
public int Id { get; set; }
public string Content { get; set; } = "";
public DateTime CreatedDate { get; set; } = [Link];
public string UserId { get; set; } = "";
public int BlogPostId { get; set; }
}
}
[Link]
using [Link];
using [Link];
using [Link];
using [Link];
[Link]();
[Link]<ApplicationUser>(options =>
{
[Link] = false;
})
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
[Link]();
[Link]();
[Link]();
[Link]();
[Link]();
[Link]();
[Link](
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
[Link]();
[Link]();
Veiw Blog
(Create)
@model BlogPost
@{
ViewData["Title"] = "Create New Blog";
}
<div class="mb-3">
<label asp-for="Title"
class="form-label">
<i class="fas fa-
heading"></i> Title
</label>
<input asp-for="Title"
class="form-control" placeholder="Enter blog title"
/>
<span asp-validation-
for="Title" class="text-danger"></span>
</div>
<div class="mb-3">
<label asp-
for="Content" class="form-label">
<i class="fas fa-
edit"></i> Content
</label>
<textarea asp-
for="Content" class="form-control" rows="10"
placeholder="
Write your blog content here..."></textarea>
<span asp-validation-
for="Content" class="text-danger"></span>
</div>
@section Scripts {
@{
await
[Link]("_ValidationScriptsPartial"
);
}
}
Delete
@model BlogPost
@{
ViewData["Title"] = "Delete Blog";
}
<form asp-action="Delete">
<input type="hidden" asp-
for="Id" />
<div class="d-flex justify-
content-between">
<a asp-action="Index"
class="btn btn-outline-secondary">
<i class="fas fa-
arrow-left"></i> Cancel
</a>
<button type="submit"
class="btn btn-danger">
<i class="fas fa-
trash"></i> Confirm Delete
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
Details
@model BlogPost
@{
ViewData["Title"] = [Link];
var comments = [Link] as
List<Comment> ?? new List<Comment>();
}
<article class="card">
<div class="card-body">
<div class="d-flex justify-content-
between align-items-start mb-3">
<div>
<span class="badge bg-
primary">@[Link]</span>
@if (![Link])
{
<span class="badge bg-
warning">Draft</span>
}
</div>
<small class="text-muted">
<i class="far fa-calendar"></i>
@[Link]("MMMM dd, yyyy")
</small>
</div>
<h1 class="card-
title">@[Link]</h1>
<hr />
<div class="blog-content">
@[Link]([Link]("\n
", "<br>"))
</div>
<hr />
@if ([Link]("Admin"))
{
<div>
<a asp-action="Edit" asp-
route-id="@[Link]" class="btn btn-warning">
<i class="fas fa-
edit"></i> Edit
</a>
<a asp-action="Delete" asp-
route-id="@[Link]" class="btn btn-danger">
<i class="fas fa-
trash"></i> Delete
</a>
</div>
}
</div>
</div>
</article>
<div class="card-body">
<!-- Add Comment Form -->
@if ([Link])
{
<div class="mb-4">
<h6>Add a Comment</h6>
<form asp-controller="Comment"
asp-action="Create" method="post">
<input type="hidden"
name="blogPostId" value="@[Link]" />
<div class="mb-3">
<textarea
name="content" class="form-control" rows="3"
placeholder="Shar
e your thoughts..." required></textarea>
</div>
<button type="submit"
class="btn btn-primary">
<i class="fas fa-paper-
plane"></i> Post Comment
</button>
</form>
</div>
}
else
{
<div class="alert alert-info">
<i class="fas fa-info-
circle"></i> Please <a asp-area="Identity" asp-
page="/Account/Login">login</a> to post a comment.
</div>
}
Edit
@model BlogPost
@{
ViewData["Title"] = "Edit Blog";
}
<div class="mb-3">
<label asp-for="Title"
class="form-label">
<i class="fas fa-
heading"></i> Title
</label>
<input asp-for="Title"
class="form-control" />
<span asp-validation-
for="Title" class="text-danger"></span>
</div>
<div class="mb-3">
<label asp-
for="Content" class="form-label">
<i class="fas fa-
edit"></i> Content
</label>
<textarea asp-
for="Content" class="form-control"
rows="10"></textarea>
<span asp-validation-
for="Content" class="text-danger"></span>
</div>
@section Scripts {
@{
await
[Link]("_ValidationScriptsPartial"
);
}
}
Index
@model IEnumerable<BlogPost>
@{
ViewData["Title"] = "Tech Blogs";
}
<div class="row">
@foreach (var blog in Model)
{
<div class="col-md-6">
<div class="card">
<div class="card-body">
<div class="d-flex justify-
content-between align-items-start">
<div>
<span class="badge
bg-info category-badge">@[Link]</span>
@if
(![Link])
{
<span
class="badge bg-warning category-
badge">Draft</span>
}
</div>
<small class="text-
muted">
<i class="far fa-
calendar"></i> @[Link]("MMM dd,
yyyy")
</small>
</div>
<div>
@if
([Link]("Admin"))
{
<a asp-
action="Edit" asp-route-id="@[Link]" class="btn
btn-warning btn-sm btn-action">
<i
class="fas fa-edit"></i> Edit
</a>
<a asp-
action="Delete" asp-route-id="@[Link]" class="btn
btn-danger btn-sm btn-action">
<i
class="fas fa-trash"></i> Delete
</a>
}
</div>
</div>
</div>
</div>
</div>
}
</div>
@if (![Link]())
{
<div class="text-center py-5">
<i class="fas fa-newspaper fa-4x text-
muted mb-3"></i>
<h3 class="text-muted">No blog posts
yet</h3>
@if ([Link]("Admin"))
{
<p class="lead">Be the first to
create a blog post!</p>
<a asp-action="Create" class="btn
btn-primary btn-lg">
<i class="fas fa-plus"></i>
Create Your First Blog
</a>
}
else
{
<p class="lead">Check back soon for
new posts!</p>
}
</div>
}
</div>
Home
Index
@{
ViewData["Title"] = "Home - Tech Blog";
}
<div class="col-md-4">
<div class="feature-card p-4 text-
center h-100">
<div class="feature-icon mb-4">
<i class="fas fa-comments fa-3x
text-success"></i>
</div>
<h4 class="fw-bold mb-
3">Interactive Community</h4>
<p class="text-muted">
Engage with fellow tech
enthusiasts through comments, discussions,
and knowledge sharing in our
vibrant community.
</p>
</div>
</div>
<div class="col-md-4">
<div class="feature-card p-4 text-
center h-100">
<div class="feature-icon mb-4">
<i class="fas fa-shield-alt fa-
3x text-info"></i>
</div>
<h4 class="fw-bold mb-3">Secure
Platform</h4>
<p class="text-muted">
Your data and privacy are our
top priority. We implement industry-standard
security measures to protect
your information.
</p>
</div>
</div>
</div>
</div>
<div class="row">
<!-- Blog cards will be dynamically
loaded from database -->
<div class="col-md-6">
<div class="card blog-preview-card
mb-4">
<div class="card-body">
<span class="badge bg-
primary mb-3">[Link]</span>
<h5 class="card-title fw-
bold">Getting Started with [Link] Core</h5>
<p class="card-text text-
muted">
Learn the fundamentals
of building web applications with [Link] Core
and explore its
powerful features for modern web development.
</p>
<div class="d-flex justify-
content-between align-items-center">
<small class="text-
muted">
<i class="far fa-
clock me-1"></i> 2 days ago
</small>
<a href="#" class="btn
btn-sm btn-outline-primary">Read More</a>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card blog-preview-card
mb-4">
<div class="card-body">
<span class="badge bg-
success mb-3">C#</span>
<h5 class="card-title fw-
bold">C# 12 New Features</h5>
<p class="card-text text-
muted">
Explore the latest
features introduced in C# 12 and learn how to
leverage them to write
cleaner, more efficient code.
</p>
<div class="d-flex justify-
content-between align-items-center">
<small class="text-
muted">
<i class="far fa-
clock me-1"></i> 1 week ago
</small>
<a href="#" class="btn
btn-sm btn-outline-primary">Read More</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<style>
.hero-section {
background: linear-gradient(135deg, #667eea
0%, #764ba2 100%);
color: white;
border-radius: 20px;
margin: 20px auto;
max-width: 95%;
box-shadow: 0 10px 40px rgba(0,0,0,0.1);
}
.text-gradient {
background: linear-gradient(90deg, #ff7e5f,
#feb47b);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.feature-card {
background: white;
border-radius: 15px;
box-shadow: 0 5px 20px rgba(0,0,0,0.08);
transition: transform 0.3s ease;
border: 1px solid #eef2f7;
}
.feature-card:hover {
transform: translateY(-10px);
box-shadow: 0 15px 30px rgba(0,0,0,0.15);
}
.feature-icon {
width: 80px;
height: 80px;
margin: 0 auto;
display: flex;
align-items: center;
justify-content: center;
background: rgba(102, 126, 234, 0.1);
border-radius: 50%;
}
.blog-preview-card {
border: none;
border-radius: 15px;
box-shadow: 0 5px 15px rgba(0,0,0,0.08);
transition: all 0.3s ease;
height: 100%;
}
.blog-preview-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 25px rgba(0,0,0,0.15);
}
.stat-card {
padding: 30px 20px;
background: white;
border-radius: 15px;
box-shadow: 0 5px 15px rgba(0,0,0,0.08);
transition: all 0.3s ease;
}
.stat-card:hover {
transform: scale(1.05);
box-shadow: 0 10px 25px rgba(0,0,0,0.15);
}
.counter {
font-size: 2.5rem;
color: #333;
}
.btn-primary, .btn-outline-primary:hover {
background: linear-gradient(135deg, #667eea
0%, #764ba2 100%);
border: none;
}
.btn-outline-primary {
border: 2px solid #667eea;
color: #667eea;
}
.btn-lg {
font-weight: 600;
border-radius: 12px;
}
</style>
<script>
// Counter animation
[Link]('DOMContentLoaded',
function() {
const counters =
[Link]('.counter');
const speed = 200;
[Link](counter => {
const animate = () => {
const value =
+[Link]('data-target');
const data = +[Link];
Privacy
@{
ViewData["Title"] = "Privacy Policy";
}
<div class="d-
flex align-items-center mb-3">
<div
class="contact-icon me-3">
<i
class="fas fa-phone fa-lg text-success"></i>
</div>
<div>
<h6
class="mb-0">Phone</h6>
<p
class="text-muted mb-0">+8801568016429</p>
</div>
</div>
<div class="d-
flex align-items-center">
<div
class="contact-icon me-3">
<i
class="fas fa-clock fa-lg text-warning"></i>
</div>
<div>
<h6
class="mb-0">Response Time</h6>
<p
class="text-muted mb-0">Within 48 hours during
business days</p>
</div>
</div>
</div>
</div>
<div class="col-md-4
text-center">
<div
class="contact-illustration">
<i class="fas
fa-headset fa-6x text-primary opacity-75"></i>
</div>
</div>
</div>
</div>
</div>
</div>
<style>
.hero-section {
background: linear-gradient(135deg, #667eea
0%, #764ba2 100%);
color: white;
border-radius: 20px;
margin: 20px auto;
max-width: 95%;
box-shadow: 0 10px 40px rgba(0,0,0,0.1);
}
.text-gradient {
color: #667eea;
background: linear-gradient(90deg, #ff7e5f,
#feb47b);
background-clip: border-box;
-webkit-background-clip: border-box;
}
.feature-card {
background: white;
border-radius: 15px;
box-shadow: 0 5px 20px rgba(0,0,0,0.08);
transition: transform 0.3s ease;
border: 1px solid #eef2f7;
}
.feature-card:hover {
transform: translateY(-10px);
box-shadow: 0 15px 30px
rgba(0,0,0,0.15);
}
.feature-icon {
width: 80px;
height: 80px;
margin: 0 auto;
display: flex;
align-items: center;
justify-content: center;
background: rgba(102, 126, 234, 0.1);
border-radius: 50%;
}
.blog-preview-card {
border: none;
border-radius: 15px;
box-shadow: 0 5px 15px rgba(0,0,0,0.08);
transition: all 0.3s ease;
height: 100%;
}
.blog-preview-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 25px
rgba(0,0,0,0.15);
}
.stat-card {
padding: 30px 20px;
background: white;
border-radius: 15px;
box-shadow: 0 5px 15px rgba(0,0,0,0.08);
transition: all 0.3s ease;
}
.stat-card:hover {
transform: scale(1.05);
box-shadow: 0 10px 25px
rgba(0,0,0,0.15);
}
.counter {
font-size: 2.5rem;
color: #333;
}
.btn-primary, .btn-outline-primary:hover {
background: linear-gradient(135deg, #667eea
0%, #764ba2 100%);
border: none;
}
.btn-outline-primary {
border: 2px solid #667eea;
color: #667eea;
}
.btn-lg {
font-weight: 600;
border-radius: 12px;
}
</style>
<script>
[Link]('DOMContentLoaded',
function() {
// Smooth scrolling for table of contents
links
[Link]('a[href^="#"]').f
orEach(anchor => {
[Link]('click',
function(e) {
[Link]();
const targetId =
[Link]('href');
if (targetId === '#') return;
const targetElement =
[Link](targetId);
if (targetElement) {
[Link]({
top:
[Link] - 100,
behavior: 'smooth'
});
}
});
});
// Back to top button
const backToTopButton =
[Link]('backToTop');
[Link]('scroll',
function() {
if ([Link] > 300) {
[Link] =
'block';
} else {
[Link] =
'none';
}
});
[Link]('click',
function(e) {
[Link]();
[Link]({
top: 0,
behavior: 'smooth'
});
});
[Link]('scroll',
function() {
let current = '';
[Link](section => {
const sectionTop =
[Link];
const sectionHeight =
[Link];
if (pageYOffset >= sectionTop -
150) {
current =
[Link]('id');
}
});
[Link](link => {
[Link]('active');
if ([Link]('href') ===
`#${current}`) {
[Link]('active');
}
});
});
});
</script>
Layout
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-
width, initial-scale=1.0" />
<title>@ViewData["Title"] - Tech Blog</title>
<link rel="stylesheet"
href="~/lib/bootstrap/dist/css/[Link]"
/>
<link rel="stylesheet"
href="[Link]
awesome/6.0.0/css/[Link]" />
<link rel="stylesheet" href="~/css/[Link]"
asp-append-version="true" />
<style>
body {
background-color: #f8f9fa;
}
.navbar {
box-shadow: 0 2px 4px rgba(0,0,0,.1);
}
.card {
transition: transform 0.3s;
margin-bottom: 20px;
border: none;
box-shadow: 0 2px 4px rgba(0,0,0,.1);
}
.card:hover {
transform: translateY(-5px);
box-shadow: 0 4px 8px
rgba(0,0,0,.15);
}
.btn-action {
margin-right: 5px;
}
.blog-content {
line-height: 1.8;
font-size: 1.1rem;
}
.category-badge {
font-size: 0.8rem;
margin-right: 5px;
}
.comment-card {
border-left: 3px solid #007bff;
margin-bottom: 10px;
}
</style>
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-
toggleable-sm navbar-dark bg-primary border-bottom
box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area=""
asp-controller="Home" asp-action="Index">
<i class="fas fa-blog"></i>
Tech Blog
</a>
<button class="navbar-toggler"
type="button" data-bs-toggle="collapse" data-bs-
target=".navbar-collapse">
<span class="navbar-toggler-
icon"></span>
</button>
<div class="navbar-collapse
collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-
grow-1">
<li class="nav-item">
<a class="nav-link"
asp-controller="Home" asp-action="Index">
<i class="fas fa-
home"></i> Home
</a>
</li>
<li class="nav-item">
<a class="nav-link"
asp-controller="Blog" asp-action="Index">
<i class="fas fa-
newspaper"></i> Blogs
</a>
</li>
@if
([Link]("Admin"))
{
<li class="nav-item">
<a class="nav-link"
asp-controller="Blog" asp-action="Create">
<i class="fas
fa-plus-circle"></i> New Post
</a>
</li>
}
<li class="nav-item">
<a class="nav-link"
asp-controller="Home" asp-action="Privacy">
<i class="fas fa-
shield-alt"></i> Privacy
</a>
</li>
</ul>
<partial name="_LoginPartial"
/>
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
<!-- Success/Error Messages -->
@if (TempData["SuccessMessage"] !=
null)
{
<div class="alert alert-success
alert-dismissible fade show" role="alert">
@TempData["SuccessMessage"]
<button type="button"
class="btn-close" data-bs-dismiss="alert"></button>
</div>
}
@if (TempData["ErrorMessage"] != null)
{
<div class="alert alert-danger
alert-dismissible fade show" role="alert">
@TempData["ErrorMessage"]
<button type="button"
class="btn-close" data-bs-dismiss="alert"></button>
</div>
}
@RenderBody()
</main>
</div>
<script
src="~/lib/jquery/dist/[Link]"></script>
<script
src="~/lib/bootstrap/dist/js/[Link].j
s"></script>
<script src="~/js/[Link]" asp-append-
version="true"></script>
@await RenderSectionAsync("Scripts", required:
false)
</body>
</html>
Layout partial
@using [Link]
@using [Link]
@inject SignInManager<ApplicationUser>
SignInManager
@inject UserManager<ApplicationUser> UserManager
<ul class="navbar-nav">
@if ([Link](User))
{
<li class="nav-item">
<a id="manage" class="nav-link text-
light" asp-area="Identity" asp-
page="/Account/Manage/Index" title="Manage">
<i class="fas fa-user"></i> Hello
@[Link](User)!
</a>
</li>
<li class="nav-item">
<form id="logoutForm" class="form-
inline" asp-area="Identity" asp-
page="/Account/Logout" asp-route-
returnUrl="@[Link]("Index", "Home", new { area
= "" })">
<button id="logout" type="submit"
class="nav-link btn btn-link text-light border-0">
<i class="fas fa-sign-out-
alt"></i> Logout
</button>
</form>
</li>
}
else
{
<li class="nav-item">
<a class="nav-link text-light"
id="register" asp-area="Identity" asp-
page="/Account/Register">
<i class="fas fa-user-plus"></i>
Register
</a>
</li>
<li class="nav-item">
<a class="nav-link text-light"
id="login" asp-area="Identity" asp-
page="/Account/Login">
<i class="fas fa-sign-in-alt"></i>
Login
</a>
</li>
}
</ul>