ASP.NET Core MVC 项目示例
下面给你一个完整可运行的 ASP.NET Core MVC 项目示例,包含 Student 的增删改查(CRUD)和 Razor 视图。
一、项目准备
创建项目时选择 ASP.NET Core Web 应用(模型-视图-控制器),项目名 MvcStudent。
安装 NuGet 包:
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
二、模型 Models/Student.cs
using System.ComponentModel.DataAnnotations; namespace MvcStudent.Models { public class Student { public int Id { get; set; } [Required(ErrorMessage = "姓名必填")] [Display(Name = "姓名")] public string Name { get; set; } = string.Empty; [Range(1, 150, ErrorMessage = "年龄需在 1-150 之间")] [Display(Name = "年龄")] public int Age { get; set; } [Display(Name = "班级")] public string? ClassName { get; set; } } }
三、数据库上下文 Data/AppDbContext.cs
using Microsoft.EntityFrameworkCore; using MvcStudent.Models; namespace MvcStudent.Data { public class AppDbContext : DbContext { public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } public DbSet<Student> Students { get; set; } } }
四、配置文件 appsettings.json
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MvcStudentDb;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
五、注册服务 Program.cs
using Microsoft.EntityFrameworkCore; using MvcStudent.Data; var builder = WebApplication.CreateBuilder(args); // 注册 DbContext builder.Services.AddDbContext<AppDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); builder.Services.AddControllersWithViews(); var app = builder.Build(); if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Students}/{action=Index}/{id?}"); app.Run();
六、控制器 Controllers/StudentsController.cs
using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using MvcStudent.Data; using MvcStudent.Models; namespace MvcStudent.Controllers { public class StudentsController : Controller { private readonly AppDbContext _context; public StudentsController(AppDbContext context) { _context = context; } // GET: /Students public async Task<IActionResult> Index() { return View(await _context.Students.ToListAsync()); } // GET: /Students/Details/5 public async Task<IActionResult> Details(int? id) { if (id == null) return NotFound(); var student = await _context.Students .FirstOrDefaultAsync(m => m.Id == id); if (student == null) return NotFound(); return View(student); } // GET: /Students/Create public IActionResult Create() { return View(); } // POST: /Students/Create [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Create( [Bind("Id,Name,Age,ClassName")] Student student) { if (ModelState.IsValid) { _context.Add(student); await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); } return View(student); } // GET: /Students/Edit/5 public async Task<IActionResult> Edit(int? id) { if (id == null) return NotFound(); var student = await _context.Students.FindAsync(id); if (student == null) return NotFound(); return View(student); } // POST: /Students/Edit/5 [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Edit(int id, [Bind("Id,Name,Age,ClassName")] Student student) { if (id != student.Id) return NotFound(); if (ModelState.IsValid) { try { _context.Update(student); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!StudentExists(student.Id)) return NotFound(); throw; } return RedirectToAction(nameof(Index)); } return View(student); } // GET: /Students/Delete/5 public async Task<IActionResult> Delete(int? id) { if (id == null) return NotFound(); var student = await _context.Students .FirstOrDefaultAsync(m => m.Id == id); if (student == null) return NotFound(); return View(student); } // POST: /Students/Delete/5 [HttpPost, ActionName("Delete")] [ValidateAntiForgeryToken] public async Task<IActionResult> DeleteConfirmed(int id) { var student = await _context.Students.FindAsync(id); if (student != null) { _context.Students.Remove(student); await _context.SaveChangesAsync(); } return RedirectToAction(nameof(Index)); } private bool StudentExists(int id) { return _context.Students.Any(e => e.Id == id); } } }
七、视图
1. Views/Students/Index.cshtml
@model IEnumerable<MvcStudent.Models.Student> @{ ViewData["Title"] = "学生列表"; } <h1>学生列表</h1> <p> <a asp-action="Create" class="btn btn-primary">新增学生</a> </p> <table class="table table-striped"> <thead> <tr> <th>@Html.DisplayNameFor(m => m.Name)</th> <th>@Html.DisplayNameFor(m => m.Age)</th> <th>@Html.DisplayNameFor(m => m.ClassName)</th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model) { <tr> <td>@Html.DisplayFor(m => item.Name)</td> <td>@Html.DisplayFor(m => item.Age)</td> <td>@Html.DisplayFor(m => item.ClassName)</td> <td> <a asp-action="Edit" asp-route-id="@item.Id">编辑</a> | <a asp-action="Details" asp-route-id="@item.Id">详情</a> | <a asp-action="Delete" asp-route-id="@item.Id">删除</a> </td> </tr> } </tbody> </table>
2. Views/Students/Create.cshtml
@model MvcStudent.Models.Student @{ ViewData["Title"] = "新增学生"; } <h1>新增学生</h1> <div class="row"> <div class="col-md-4"> <form asp-action="Create"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <div class="form-group"> <label asp-for="Name" class="control-label"></label> <input asp-for="Name" class="form-control" /> <span asp-validation-for="Name" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Age" class="control-label"></label> <input asp-for="Age" class="form-control" /> <span asp-validation-for="Age" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="ClassName" class="control-label"></label> <input asp-for="ClassName" class="form-control" /> <span asp-validation-for="ClassName" class="text-danger"></span> </div> <div class="form-group mt-3"> <input type="submit" value="保存" class="btn btn-primary" /> <a asp-action="Index" class="btn btn-secondary">返回列表</a> </div> </form> </div> </div> @section Scripts { @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); } }
3. Views/Students/Edit.cshtml
@model MvcStudent.Models.Student @{ ViewData["Title"] = "编辑学生"; } <h1>编辑学生</h1> <div class="row"> <div class="col-md-4"> <form asp-action="Edit"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <input type="hidden" asp-for="Id" /> <div class="form-group"> <label asp-for="Name" class="control-label"></label> <input asp-for="Name" class="form-control" /> <span asp-validation-for="Name" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Age" class="control-label"></label> <input asp-for="Age" class="form-control" /> <span asp-validation-for="Age" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="ClassName" class="control-label"></label> <input asp-for="ClassName" class="form-control" /> <span asp-validation-for="ClassName" class="text-danger"></span> </div> <div class="form-group mt-3"> <input type="submit" value="保存" class="btn btn-primary" /> <a asp-action="Index" class="btn btn-secondary">返回列表</a> </div> </form> </div> </div> @section Scripts { @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); } }
4. Views/Students/Details.cshtml
@model MvcStudent.Models.Student @{ ViewData["Title"] = "学生详情"; } <h1>学生详情</h1> <div> <dl class="row"> <dt class="col-sm-2">@Html.DisplayNameFor(m => m.Name)</dt> <dd class="col-sm-10">@Html.DisplayFor(m => m.Name)</dd> <dt class="col-sm-2">@Html.DisplayNameFor(m => m.Age)</dt> <dd class="col-sm-10">@Html.DisplayFor(m => m.Age)</dd> <dt class="col-sm-2">@Html.DisplayNameFor(m => m.ClassName)</dt> <dd class="col-sm-10">@Html.DisplayFor(m => m.ClassName)</dd> </dl> </div> <div> <a asp-action="Edit" asp-route-id="@Model.Id" class="btn btn-primary">编辑</a> <a asp-action="Index" class="btn btn-secondary">返回列表</a> </div>
5. Views/Students/Delete.cshtml
@model MvcStudent.Models.Student @{ ViewData["Title"] = "删除学生"; } <h1>删除学生</h1> <h3 class="text-danger">确定要删除这条记录吗?</h3> <div> <dl class="row"> <dt class="col-sm-2">@Html.DisplayNameFor(m => m.Name)</dt> <dd class="col-sm-10">@Html.DisplayFor(m => m.Name)</dd> <dt class="col-sm-2">@Html.DisplayNameFor(m => m.Age)</dt> <dd class="col-sm-10">@Html.DisplayFor(m => m.Age)</dd> <dt class="col-sm-2">@Html.DisplayNameFor(m => m.ClassName)</dt> <dd class="col-sm-10">@Html.DisplayFor(m => m.ClassName)</dd> </dl> <form asp-action="Delete"> <input type="hidden" asp-for="Id" /> <input type="submit" value="确认删除" class="btn btn-danger" /> <a asp-action="Index" class="btn btn-secondary">返回列表</a> </form> </div>
八、生成数据库
打开 工具 → NuGet 包管理器 → 程序包管理器控制台,执行:
Add-Migration InitialCreate
Update-Database
若提示找不到命令,确认已安装 Microsoft.EntityFrameworkCore.Tools,并重启 VS
九、运行
按 F5 启动,浏览器会自动跳到 /Students,即可进行增删改查。
十、文件结构总览
MvcStudent/
├── Controllers/
│ └── StudentsController.cs
├── Data/
│ └── AppDbContext.cs
├── Models/
│ └── Student.cs
├── Views/
│ └── Students/
│ ├── Index.cshtml
│ ├── Create.cshtml
│ ├── Edit.cshtml
│ ├── Details.cshtml
│ └── Delete.cshtml
├── appsettings.json
└── Program.cs
到这里,一个功能完整的 MVC CRUD 项目就整合好了。
作者:学习靠自己
出处:http://www.cnblogs.com/net064/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
土豪打赏

浙公网安备 33010602011771号