打赏

AIGC标识 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 项目就整合好了。

 

posted @ 2026-09-23 20:36  学习靠自己  阅读(0)  评论(0)    收藏  举报