.NET MVC 框架基础大全 - 详解

下面是一个完整的 ASP.NET Core MVC 项目基础框架指南,包含项目结构、配置、核心功能和最佳实践。

安装环境sdk,可以通过微软网站下载-dotnet-sdk-8.0.413-win-x64.exe

1. 项目创建与基本命令

# 创建新的 MVC 项目
dotnet new mvc -n YourProjectName
# 进入项目目录
cd YourProjectName
# 添加必要的包
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore
# 运行项目(开发模式)
dotnet run --environment Development
# 或简写
dotnet run dev

2. 项目结构详解

YourProjectName/
├── Controllers/          # 控制器
├── Models/              # 数据模型
├── Views/               # 视图
├── ViewModels/          # 视图模型
├── Services/            # 业务逻辑服务
├── Data/                # 数据访问层
├── wwwroot/             # 静态资源
├── Properties/          # 项目属性
│   └── launchSettings.json
├── Program.cs           # 程序入口
├── appsettings.json     # 配置文件
└── YourProjectName.csproj

3. 核心配置文件

Program.cs - 现代 .NET 6+ 风格

using Microsoft.EntityFrameworkCore;
using YourProjectName.Data;
using YourProjectName.Services;
var builder = WebApplication.CreateBuilder(args);
// 添加服务到容器
builder.Services.AddControllersWithViews();
builder.Services.AddDbContext(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
builder.Services.AddScoped();
builder.Services.AddScoped();
// 配置身份认证(如果需要)
builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = "Cookies";
    options.DefaultChallengeScheme = "Google";
})
.AddCookie("Cookies")
.AddGoogle("Google", options =>
{
    options.ClientId = builder.Configuration["Authentication:Google:ClientId"];
    options.ClientSecret = builder.Configuration["Authentication:Google:ClientSecret"];
});
var app = builder.Build();
// 配置 HTTP 请求管道
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
// 添加自定义路由
app.MapControllerRoute(
    name: "admin",
    pattern: "admin/{controller=Dashboard}/{action=Index}/{id?}");
app.Run();

appsettings.json

json

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=YourProjectDb;Trusted_Connection=true;MultipleActiveResultSets=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "Authentication": {
    "Google": {
      "ClientId": "your_google_client_id",
      "ClientSecret": "your_google_client_secret"
    }
  },
  "AllowedHosts": "*"
}

4. 数据模型与数据库上下文

Models/User.cs

using System.ComponentModel.DataAnnotations;
namespace YourProjectName.Models
{
    public class User
    {
        public int Id { get; set; }
        [Required]
        [StringLength(100)]
        public string Name { get; set; }
        [Required]
        [EmailAddress]
        public string Email { get; set; }
        [DataType(DataType.Date)]
        public DateTime CreatedAt { get; set; } = DateTime.Now;
        // 导航属性
        public virtual ICollection Orders { get; set; }
    }
    public class Product
    {
        public int Id { get; set; }
        [Required]
        [StringLength(200)]
        public string Name { get; set; }
        [DataType(DataType.Currency)]
        public decimal Price { get; set; }
        public string Description { get; set; }
        public bool IsActive { get; set; } = true;
    }
}

Data/ApplicationDbContext.cs

using Microsoft.EntityFrameworkCore;
using YourProjectName.Models;
namespace YourProjectName.Data
{
    public class ApplicationDbContext : DbContext
    {
        public ApplicationDbContext(DbContextOptions options)
            : base(options)
        {
        }
        public DbSet Users { get; set; }
        public DbSet Products { get; set; }
        public DbSet Orders { get; set; }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // 配置模型关系
            modelBuilder.Entity()
                .HasOne(o => o.User)
                .WithMany(u => u.Orders)
                .HasForeignKey(o => o.UserId);
            // 数据种子
            modelBuilder.Entity().HasData(
                new Product { Id = 1, Name = "示例产品", Price = 99.99m, Description = "这是一个示例产品" }
            );
        }
    }
}

5. 服务层实现

Services/IUserService.cs

using YourProjectName.Models;
namespace YourProjectName.Services
{
    public interface IUserService
    {
        Task> GetAllUsersAsync();
        Task GetUserByIdAsync(int id);
        Task CreateUserAsync(User user);
        Task UpdateUserAsync(User user);
        Task DeleteUserAsync(int id);
    }
    public class UserService : IUserService
    {
        private readonly ApplicationDbContext _context;
        public UserService(ApplicationDbContext context)
        {
            _context = context;
        }
        public async Task> GetAllUsersAsync()
        {
            return await _context.Users.ToListAsync();
        }
        public async Task GetUserByIdAsync(int id)
        {
            return await _context.Users.FindAsync(id);
        }
        public async Task CreateUserAsync(User user)
        {
            _context.Users.Add(user);
            await _context.SaveChangesAsync();
            return user;
        }
        public async Task UpdateUserAsync(User user)
        {
            _context.Users.Update(user);
            await _context.SaveChangesAsync();
            return user;
        }
        public async Task DeleteUserAsync(int id)
        {
            var user = await _context.Users.FindAsync(id);
            if (user == null) return false;
            _context.Users.Remove(user);
            await _context.SaveChangesAsync();
            return true;
        }
    }
}

6. 控制器实现

Controllers/UsersController.cs

using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using YourProjectName.Models;
using YourProjectName.Services;
namespace YourProjectName.Controllers
{
    public class UsersController : Controller
    {
        private readonly IUserService _userService;
        public UsersController(IUserService userService)
        {
            _userService = userService;
        }
        // GET: Users
        public async Task Index()
        {
            var users = await _userService.GetAllUsersAsync();
            return View(users);
        }
        // GET: Users/Details/5
        public async Task Details(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var user = await _userService.GetUserByIdAsync(id.Value);
            if (user == null)
            {
                return NotFound();
            }
            return View(user);
        }
        // GET: Users/Create
        public IActionResult Create()
        {
            return View();
        }
        // POST: Users/Create
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task Create([Bind("Name,Email")] User user)
        {
            if (ModelState.IsValid)
            {
                await _userService.CreateUserAsync(user);
                return RedirectToAction(nameof(Index));
            }
            return View(user);
        }
        // GET: Users/Edit/5
        public async Task Edit(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var user = await _userService.GetUserByIdAsync(id.Value);
            if (user == null)
            {
                return NotFound();
            }
            return View(user);
        }
        // POST: Users/Edit/5
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task Edit(int id, [Bind("Id,Name,Email,CreatedAt")] User user)
        {
            if (id != user.Id)
            {
                return NotFound();
            }
            if (ModelState.IsValid)
            {
                try
                {
                    await _userService.UpdateUserAsync(user);
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!await UserExists(user.Id))
                    {
                        return NotFound();
                    }
                    else
                    {
                        throw;
                    }
                }
                return RedirectToAction(nameof(Index));
            }
            return View(user);
        }
        // GET: Users/Delete/5
        public async Task Delete(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var user = await _userService.GetUserByIdAsync(id.Value);
            if (user == null)
            {
                return NotFound();
            }
            return View(user);
        }
        // POST: Users/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public async Task DeleteConfirmed(int id)
        {
            await _userService.DeleteUserAsync(id);
            return RedirectToAction(nameof(Index));
        }
        private async Task UserExists(int id)
        {
            return await _userService.GetUserByIdAsync(id) != null;
        }
    }
}

7. 视图实现

Views/Users/Index.cshtml

@model IEnumerable
@{
    ViewData["Title"] = "用户列表";
}
用户列表
    创建新用户
            @Html.DisplayNameFor(model => model.Name)
            @Html.DisplayNameFor(model => model.Email)
            @Html.DisplayNameFor(model => model.CreatedAt)
            操作
@foreach (var item in Model) {
            @Html.DisplayFor(modelItem => item.Name)
            @Html.DisplayFor(modelItem => item.Email)
            @Html.DisplayFor(modelItem => item.CreatedAt)
                编辑
                详情
                删除
}

8. 视图模型

ViewModels/UserViewModel.cs

using System.ComponentModel.DataAnnotations;
namespace YourProjectName.ViewModels
{
    public class UserViewModel
    {
        public int Id { get; set; }
        [Required(ErrorMessage = "姓名是必填项")]
        [Display(Name = "姓名")]
        [StringLength(100, ErrorMessage = "姓名长度不能超过100个字符")]
        public string Name { get; set; }
        [Required(ErrorMessage = "邮箱是必填项")]
        [EmailAddress(ErrorMessage = "请输入有效的邮箱地址")]
        [Display(Name = "邮箱地址")]
        public string Email { get; set; }
        [DataType(DataType.Password)]
        [Display(Name = "密码")]
        public string Password { get; set; }
        [DataType(DataType.Password)]
        [Display(Name = "确认密码")]
        [Compare("Password", ErrorMessage = "密码和确认密码不匹配")]
        public string ConfirmPassword { get; set; }
    }
}

9. 中间件和过滤器

Filters/LogActionFilter.cs

using Microsoft.AspNetCore.Mvc.Filters;
namespace YourProjectName.Filters
{
    public class LogActionFilter : IActionFilter
    {
        private readonly ILogger _logger;
        public LogActionFilter(ILogger logger)
        {
            _logger = logger;
        }
        public void OnActionExecuting(ActionExecutingContext context)
        {
            _logger.LogInformation($"执行动作: {context.ActionDescriptor.DisplayName}");
        }
        public void OnActionExecuted(ActionExecutedContext context)
        {
            _logger.LogInformation($"动作执行完成: {context.ActionDescriptor.DisplayName}");
        }
    }
}

10. 项目文件配置

YourProjectName.csproj

xml

    net8.0
    enable
    enable

11. 数据库迁移命令

# 创建迁移
dotnet ef migrations add InitialCreate
# 更新数据库
dotnet ef database update
# 删除迁移
dotnet ef migrations remove
# 生成数据库脚本
dotnet ef migrations script

12. 开发和生产环境配置

appsettings.Development.json

json

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=YourProjectDb_Dev;Trusted_Connection=true;MultipleActiveResultSets=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Information"
    }
  }
}

appsettings.Production.json

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=production-server;Database=YourProjectDb;User Id=username;Password=password;"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning",
      "Microsoft.AspNetCore": "Warning"
    }
  }
}

这个框架大全涵盖了 ASP.NET Core MVC 项目的基础结构和核心功能。您可以根据具体需求进行扩展和定制。

posted on 2025-10-10 13:56  ljbguanli  阅读(2)  评论(0)    收藏  举报