ASP.NET MVC 实现增删改查(CRUD)操作的完整示例

提供一个完整的 ASP.NET MVC 实现增删改查(CRUD)操作的示例。该示例使用 SQL Server 数据库,以一个简单的 Product 实体为例。
步骤 1:创建 ASP.NET MVC 项目
首先,在 Visual Studio 中创建一个新的 ASP.NET MVC 项目。
步骤 2:定义数据模型
在 Models 文件夹下创建 Product.cs 文件:
csharp
using System.ComponentModel.DataAnnotations;namespace YourNamespace.Models
{public class Product{public int Id { get; set; }[Required]public string Name { get; set; }[Required]public decimal Price { get; set; }}
}
步骤 3:创建数据库上下文
在 Models 文件夹下创建 ProductContext.cs 文件:
csharp
using Microsoft.EntityFrameworkCore;namespace YourNamespace.Models
{public class ProductContext : DbContext{public ProductContext(DbContextOptions<ProductContext> options) : base(options){}public DbSet<Product> Products { get; set; }}
}
步骤 4:配置数据库连接
在 appsettings.json 文件中添加数据库连接字符串:
json
{"ConnectionStrings": {"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=YourDatabaseName;Trusted_Connection=True;MultipleActiveResultSets=true"},"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*"
}
步骤 5:在 Startup.cs 中配置数据库上下文
csharp
using Microsoft.EntityFrameworkCore;
using YourNamespace.Models;public void ConfigureServices(IServiceCollection services)
{services.AddDbContext<ProductContext>(options =>options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));services.AddControllersWithViews();
}
步骤 6:创建控制器
在 Controllers 文件夹下创建 ProductController.cs 文件:
csharp
using Microsoft.AspNetCore.Mvc;
using YourNamespace.Models;
using System.Linq;namespace YourNamespace.Controllers
{public class ProductController : Controller{private readonly ProductContext _context;public ProductController(ProductContext context){_context = context;}// 显示所有产品public IActionResult Index(){var products = _context.Products.ToList();return View(products);}// 创建产品视图public IActionResult Create(){return View();}// 处理创建产品的 POST 请求[HttpPost][ValidateAntiForgeryToken]public IActionResult Create(Product product){if (ModelState.IsValid){_context.Products.Add(product);_context.SaveChanges();return RedirectToAction(nameof(Index));}return View(product);}// 编辑产品视图public IActionResult Edit(int? id){if (id == null){return NotFound();}var product = _context.Products.Find(id);if (product == null){return NotFound();}return View(product);}// 处理编辑产品的 POST 请求[HttpPost][ValidateAntiForgeryToken]public IActionResult Edit(int id, Product product){if (id != product.Id){return NotFound();}if (ModelState.IsValid){try{_context.Update(product);_context.SaveChanges();}catch{if (!ProductExists(product.Id)){return NotFound();}else{throw;}}return RedirectToAction(nameof(Index));}return View(product);}// 删除产品确认视图public IActionResult Delete(int? id){if (id == null){return NotFound();}var product = _context.Products.Find(id);if (product == null){return NotFound();}return View(product);}// 处理删除产品的 POST 请求[HttpPost, ActionName("Delete")][ValidateAntiForgeryToken]public IActionResult DeleteConfirmed(int id){var product = _context.Products.Find(id);_context.Products.Remove(product);_context.SaveChanges();return RedirectToAction(nameof(Index));}private bool ProductExists(int id){return _context.Products.Any(e => e.Id == id);}}
}
步骤 7:创建视图
在 Views 文件夹下创建 Product 文件夹,并在其中创建以下视图文件:
Index.cshtml
html
@model IEnumerable<YourNamespace.Models.Product>@{ViewData["Title"] = "Product List";
}<h1>Product List</h1><p><a asp-action="Create">Create New</a>
</p>
<table class="table"><thead><tr><th>@Html.DisplayNameFor(model => model.Name)</th><th>@Html.DisplayNameFor(model => model.Price)</th><th></th></tr></thead><tbody>@foreach (var item in Model){<tr><td>@Html.DisplayFor(modelItem => item.Name)</td><td>@Html.DisplayFor(modelItem => item.Price)</td><td>@Html.ActionLink("Edit", "Edit", new { id = item.Id }) |@Html.ActionLink("Delete", "Delete", new { id = item.Id })</td></tr>}</tbody>
</table>
Create.cshtml
html
@model YourNamespace.Models.Product@{ViewData["Title"] = "Create Product";
}<h1>Create Product</h1><form asp-action="Create"><div asp-validation-summary="ModelOnly" class="text-danger"></div><div class="form-group"><label asp-for="Name">Name</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="Price">Price</label><input asp-for="Price" class="form-control" /><span asp-validation-for="Price" class="text-danger"></span></div><button type="submit" class="btn btn-primary">Create</button>
</form><div><a asp-action="Index">Back to List</a>
</div>
Edit.cshtml
html
@model YourNamespace.Models.Product@{ViewData["Title"] = "Edit Product";
}<h1>Edit Product</h1><form asp-action="Edit"><input type="hidden" asp-for="Id" /><div asp-validation-summary="ModelOnly" class="text-danger"></div><div class="form-group"><label asp-for="Name">Name</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="Price">Price</label><input asp-for="Price" class="form-control" /><span asp-validation-for="Price" class="text-danger"></span></div><button type="submit" class="btn btn-primary">Save</button>
</form><div><a asp-action="Index">Back to List</a>
</div>
Delete.cshtml
html
@model YourNamespace.Models.Product@{ViewData["Title"] = "Delete Product";
}<h1>Delete Product</h1><h3>Are you sure you want to delete this?</h3>
<div><h4>Product</h4><hr /><dl class="row"><dt class="col-sm-2">@Html.DisplayNameFor(model => model.Name)</dt><dd class="col-sm-10">@Html.DisplayFor(model => model.Name)</dd><dt class="col-sm-2">@Html.DisplayNameFor(model => model.Price)</dt><dd class="col-sm-10">@Html.DisplayFor(model => model.Price)</dd></dl><form asp-action="DeleteConfirmed"><input type="hidden" asp-for="Id" /><button type="submit" class="btn btn-danger">Delete</button> |<a asp-action="Index">Back to List</a></form>
</div>
步骤 8:运行项目
运行项目,访问 Product 控制器的 Index 动作,你将看到产品列表页面,并可以进行增删改查操作。
相关文章:
ASP.NET MVC 实现增删改查(CRUD)操作的完整示例
提供一个完整的 ASP.NET MVC 实现增删改查(CRUD)操作的示例。该示例使用 SQL Server 数据库,以一个简单的 Product 实体为例。 步骤 1:创建 ASP.NET MVC 项目 首先,在 Visual Studio 中创建一个新的 ASP.NET MVC 项目…...
MCP理解笔记及deepseek使用MCP案例介绍
文章目录 一、MCP介绍(1)使用MCP与之前的AI比较(2)原理(3)优点 二、deepseek使用MCP使用案例介绍 一、MCP介绍 全称 模型上下文协议 来源 由Claude母公司Anthropic于24年底开源发布 简介 AI大模型的标准化…...
# 手写数字识别:使用PyTorch构建MNIST分类器
手写数字识别:使用PyTorch构建MNIST分类器 在这篇文章中,我将引导你通过使用PyTorch框架构建一个简单的神经网络模型,用于识别MNIST数据集中的手写数字。MNIST数据集是一个经典的机器学习数据集,包含了60,000张训练图像和10,000张…...
扩展虚拟机磁盘空间并使其在Linux系统中可用的步骤总结
VMware在虚拟机扩展空间时,若想扩展到150G,那么所在盘的空闲空间须大于150G,否则VM将不允许扩展。 1:确认新磁盘空间是否被识别 使用 lsblk 或 fdisk -l 命令检查 /dev/sda 的大小是否已经更新到新的容量(例如从原来的…...
A股周度复盘与下周策略 的deepseek提示词模板
以下是反向整理的股票大盘分析提示词模板,采用结构化框架数据占位符设计,可直接套用每周市场数据: 请根据一下markdown格式的模板,帮我检索整理并输出本周股市复盘和下周投资策略 【A股周度复盘与下周策略提示词模板】 一、市场…...
dev_set_drvdata、dev_get_drvdata使用详解
在Linux内核驱动开发中,dev_set_drvdata() 及相关函数用于管理设备驱动的私有数据,是模块化设计和数据隔离的核心工具。以下从函数定义、使用场景、示例及注意事项等方面进行详细解析: 一、函数定义与作用 核心函数 dev_set_drvdata() 和 dev…...
数据驱动未来:大数据在智能网联汽车中的深度应用
数据驱动未来:大数据在智能网联汽车中的深度应用 引言 随着智能网联汽车(Intelligent Connected Vehicles,ICV)的快速发展,数据已成为其核心驱动力。从实时交通数据到车辆传感器信息,大数据的深度应用正在让智能汽车更安全、更高效、更智能化。那么,大数据如何赋能智能…...
LeetCode:DFS综合练习
简单 1863. 找出所有子集的异或总和再求和 一个数组的 异或总和 定义为数组中所有元素按位 XOR 的结果;如果数组为 空 ,则异或总和为 0 。 例如,数组 [2,5,6] 的 异或总和 为 2 XOR 5 XOR 6 1 。 给你一个数组 nums ,请你求出 n…...
Perf学习
重要的能解决的问题是这些: perf_events is an event-oriented observability tool, which can help you solve advanced performance and troubleshooting functions. Questions that can be answered include: Why is the kernel on-CPU so much? What code-pa…...
齐次坐标变换+Unity矩阵变换
矩阵变换 变换(transform):指的是我们把一些数据,如点,方向向量甚至是颜色,通过某种方式(矩阵运算),进行转换的过程。 变换类型 线性变换:保留矢量加和标量乘的计算 f(x)…...
Pandas取代Excel?
有人在知乎上提问:为什么大公司不用pandas取代excel? 而且列出了几个理由:Pandas功能比Excel强大,运行速度更快,Excel除了简单和可视化界面外,没有其他更多的优势。 有个可怕的现实是,对比Exce…...
启动vite项目报Unexpected “\x88“ in JSON
启动vite项目报Unexpected “\x88” in JSON 通常是文件被防火墙加密需要寻找运维解决 重启重装npm install...
HTTP测试智能化升级:动态变量管理实战与效能跃迁
在Web应用、API接口测试等领域,测试场景的动态性和复杂性对测试数据的灵活管理提出了极高要求。传统的静态测试数据难以满足多用户并发、参数化请求及响应内容验证等需求。例如,在电商系统性能测试中,若无法动态生成用户ID、订单号或实时提取…...
关于一对多关系(即E-R图中1:n)中的界面展示优化和数据库设计
前言 一对多,是常见的数据库关系。在界面设计时,有时为了方便,就展示成逗号分割的字符串。例如:学生和爱好的界面。 存储 如果是简单存储,建立数据库:爱好,课程,存在一张表中。 但…...
【gpt生成-总览】怎样才算开发了一门编程语言,需要通过什么测试
开发一门真正的编程语言需要经历完整的设计、实现和验证过程,并通过系统的测试体系验证其完备性。以下是分阶段开发标准及测试方法: 一、语言开发核心阶段 1. 语言规范设计(ISO/IEC 标准级别) 语法规范:BNF/…...
JVM笔记【一】java和Tomcat类加载机制
JVM笔记一java和Tomcat类加载机制 java和Tomcat类加载机制 Java类加载 * loadClass加载步骤类加载机制类加载器初始化过程双亲委派机制全盘负责委托机制类关系图自定义类加载器打破双亲委派机制 Tomcat类加载器 * 为了解决以上问题,tomcat是如何实现类加载机制的…...
React 组件类型详解:类组件 vs. 函数组件
React 是一个用于构建用户界面的 JavaScript 库,其核心思想是组件化开发。React 组件可以分为类组件(Class Components)和函数组件(Function Components),它们在设计理念、使用方式和适用场景上有所不同。随…...
GPT-SoVITS 使用指南
一、简介 TTS(Text-to-Speech,文本转语音):是一种将文字转换为自然语音的技术,通过算法生成人类可听的语音输出,广泛应用于语音助手、无障碍服务、导航系统等场景。类似的还有SVC(歌声转换&…...
美信监控易:数据采集与整合的卓越之选
在当今复杂多变的运维环境中,一款具备强大数据采集与整合能力的运维管理软件对于企业的稳定运行和高效决策至关重要。美信监控易正是这样一款在数据采集与整合方面展现出显著优势的软件,以下是它的一些关键技术优势,值得每一个运维团队深入了…...
基于Redis的3种分布式ID生成策略
在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。 Redis具备高性能、原子操作及简单易用的特性&…...
OCR技术与视觉模型技术的区别、应用及展望
在计算机视觉技术飞速发展的当下,OCR技术与视觉模型技术成为推动各行业智能化变革的重要力量。它们在原理、应用等方面存在诸多差异,在自动化测试领域也展现出不同的表现与潜力,下面将为你详细剖析。 一、技术区别 (一ÿ…...
End-to-End从混沌到秩序:基于LLM的Pipeline将非结构化数据转化为知识图谱
摘要:本文介绍了一种将非结构化数据转换为知识图谱的端到端方法。通过使用大型语言模型(LLM)和一系列数据处理技术,我们能够从原始文本中自动提取结构化的知识。这一过程包括文本分块、LLM 提示设计、三元组提取、归一化与去重,最终利用 NetworkX 和 ipycytoscape 构建并可…...
比特币的跨输入签名聚合(Cross-Input Signature Aggregation,CISA)
1. 引言 2024 年,人权基金会(Human Rights Foundation,简称 HRF)启动了一项研究奖学金计划,旨在探讨“跨输入签名聚合”(Cross-Input Signature Aggregation,简称 CISA)的潜在影响。…...
洛谷P1177【模板】排序:十种排序算法全解(2)
我们接着上一篇继续讲【洛谷P1177【模板】排序:十种排序算法全解(1)】 三、计数排序(Counting Sort) 仅适用于数据范围较小的情况 // Java import java.io.*; public class Main {static final int OFFSET 100000;public static void…...
MySql 三大日志(redolog、undolog、binlog)详解
确保应用运行环境的一致性和可移…...
HTTP:九.WEB机器人
概念 Web机器人是能够在无需人类干预的情况下自动进行一系列Web事务处理的软件程序。人们根据这些机器人探查web站点的方式,形象的给它们取了一个饱含特色的名字,比如“爬虫”、“蜘蛛”、“蠕虫”以及“机器人”等!爬虫概述 网络爬虫(英语:web crawler),也叫网络蜘蛛(…...
2025妈妈杯数学建模C题完整分析论文(共36页)(含模型建立、可运行代码、数据)
2025 年第十五届 MathorCup 数学建模C题完整分析论文 目录 摘 要 一、问题分析 二、问题重述 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1代码(仅供参考) 4.1.4问题1求解结果(仅…...
数据结构排序算法全解析:从基础原理到实战应用
在计算机科学领域,排序算法是数据处理的核心技术之一。无论是小规模数据的简单整理,还是大规模数据的高效处理,选择合适的排序算法直接影响着程序的性能。本文将深入解析常见排序算法的核心思想、实现细节、特性对比及适用场景,帮…...
UMG:ListView
1.创建WBP_ListView,添加Border和ListView。 2.创建Object,命名为Item(数据载体,可以是其他类型)。新增变量name。 3.创建User Widget,命名为Entry(循环使用的UI载体).添加Border和Text。 4.设置Entry继承UserObjectListEntry接口。 5.Entry中对象生成时…...
