asp.net core mvc Razor +dapper 增删改查,分页(保姆教程)

说明:本demo使用sqlserver数据库,dapper orm框架 完成一张学生信息表的增删改查,前端部分使用的是Razor视图,
Linq分页 HtmlHelper。(代码随便写的,具体可以自己优化)
//实现效果如下(首页)
在这里插入图片描述
//新增页
在这里插入图片描述
//修改页
在这里插入图片描述
//删除
在这里插入图片描述
1.使用visual stuido 2022创建 asp.net core mvc项目(选择如下图)
在这里插入图片描述
2.安装dapper nuget包(选择第一个)
在这里插入图片描述
3.使用sqlserver创建数据库和数据表

USE [stu]
GO/****** Object:  Table [dbo].[StuInfo]    Script Date: 2023/9/28 18:17:23 ******/
SET ANSI_NULLS ON
GOSET QUOTED_IDENTIFIER ON
GOCREATE TABLE [dbo].[StuInfo]([Id] [int] NULL,[Name] [nchar](10) NULL,[Sex] [nchar](10) NULL,[Age] [int] NULL,[BirthDate] [date] NULL
) ON [PRIMARY]
GO

4.在项目appsetting中配置数据库连接字符串(填写自己的用户名和密码,和数据库信息)

{"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*","ConnectionStrings": {"connectionString": "Data Source=.;Initial Catalog=stu;User ID=sa;Password=pe123;TrustServerCertificate=true"}
}

5.创建数据学生信息实体类

namespace mvccore.dataModel
{public class StuInfo{public int Id { get; set; }public string? Name { get; set; }public string? Sex { get; set; }public int Age { get; set; }public DateTime BirthDate { get; set; }}
}

6.创建学生信息dto类

namespace mvccore.ViewModel
{public class stuViewModel{public int Id { get; set; }public string? Name { get; set; }public string? Sex { get; set; }public int Age { get; set; }}
}

7.创建stu的接口和实现类service(使用ioc注入面向接口编程)
创建接口和实现类后需要在program中注入服务
在这里插入图片描述

using mvccore.dataModel;
using mvccore.ViewModel;namespace mvccore.service
{public interface Istuservice{//查询List<stuViewModel> stuls();void save<T>(T stu);void edit<T>(T t);//删除void delete(int Id);//根据Id查询stuViewModel GetById(int Id);}
}
using mvccore.ViewModel;
using Dapper;
using Microsoft.Data.SqlClient;
using System.Collections.Generic;
using System.Collections;
using mvccore.dataModel;namespace mvccore.service
{public class stuservice : Istuservice{private readonly IConfiguration _configuration;public string connstring { get; set; }public stuservice(IConfiguration configuration){_configuration = configuration;connstring = _configuration.GetConnectionString("connectionString");}//删除public void delete(int Id){using (var connection = new SqlConnection(connstring)){string sql = "delete from StuInfo where Id=@Id";connection.Execute(sql, new { Id });}}//显示所有列表public List<stuViewModel> stuls(){using (var connection = new SqlConnection(connstring)){string sql = "select * from StuInfo";var list = connection.Query<stuViewModel>(sql).ToList();return list;}}//新增public void save<T>(T stu1){var stu = stu1 as stuViewModel;using (var connection = new SqlConnection(connstring)){string sql = "insert into StuInfo(Id,Name,Sex,Age) values(@Id,@Name,@Sex,@Age);";DynamicParameters parameters = new DynamicParameters();parameters.Add("Id", 20);parameters.Add("Name", stu.Name);parameters.Add("Sex", stu.Sex);parameters.Add("Age", stu.Age);connection.Execute(sql, parameters);}}//编辑public void edit<T>(T t){var stu = t as stuViewModel;string sql = "update StuInfo set Name=@Name,Age=@Age WHERE Id=@Id";using (var connection = new SqlConnection(connstring)){connection.Execute(sql, new { Name = stu?.Name, Age = stu?.Age, Id = stu?.Id });}}//根据Id查询public stuViewModel GetById(int Id){string sql = "select * from StuInfo where Id=@Id";using (var connection = new SqlConnection(connstring)){var list = connection.Query<stuViewModel>(sql, new { Id = Id }).FirstOrDefault();return list;}}}
}

8.创建分页类

namespace WebApplication4
{public class PaginatedList<T> : List<T>{public int PageIndex { get; private set; }public int TotalPages { get; private set; }public PaginatedList(List<T> items, int count, int pageIndex, int pageSize){PageIndex = pageIndex;TotalPages = (int)Math.Ceiling(count / (double)pageSize);this.AddRange(items);}public bool HasPreviousPage => PageIndex > 1;public bool HasNextPage => PageIndex < TotalPages;public static PaginatedList<T> Create(IQueryable<T> source, int pageIndex, int pageSize){var count = source.Count();var items = source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();return new PaginatedList<T>(items, count, pageIndex, pageSize);}}
}

-------------------------------至此所有的业务代码就准备好了,接下来下控制器和视图里面的代码--------------------------------------------
9.创建stu的控制器
RedirectToAction(“StuInfoList”):是指定跳转到当前控制器下的其他视图,这里我们跳转到首页

using Microsoft.AspNetCore.Mvc;
using mvccore.service;
using mvccore.ViewModel;
using WebApplication4;namespace mvccore.Controllers
{public class StuController : Controller{private readonly Istuservice _stuservice;public StuController(Istuservice stuservice){_stuservice = stuservice;}//学生列表视图public IActionResult StuInfoList(int? pageNumber = 1){var list = _stuservice.stuls().ToList();int pageSize = 3;return View(PaginatedList<stuViewModel>.Create(list.AsQueryable(), pageNumber ?? 1, pageSize));}//保存视图public IActionResult Save(){return View();}//保存方法public IActionResult Save2(stuViewModel stu){_stuservice.save<stuViewModel>(stu);return RedirectToAction("StuInfoList");}//删除方法(正式项目我们一般使用逻辑删除,不会真的把数据删掉)public IActionResult delete(int Id){_stuservice?.delete(Id);return RedirectToAction("StuInfoList");}//编辑回显public IActionResult edit(int Id){return View(_stuservice.GetById(Id));}//编辑方法public IActionResult edit2(stuViewModel stu){_stuservice?.edit(stu);return RedirectToAction("StuInfoList");}}
}

10.添加首页的视图(StuInfoList.cshtml)


@model PaginatedList<mvccore.ViewModel.stuViewModel>
@Html.ActionLink("新增","Save","Stu")
<table class="table"><tr><th>Name</th><th>Age</th><th>Sex</th><td>操作</td></tr>@foreach (var item in Model){<tr><td>@item.Name</td><td>@item.Age</td><td>@item.Sex</td><td> @Html.ActionLink("编辑","edit","Stu",new{item.Id})   @Html.ActionLink("删除","delete","Stu",new{@item.Id},new { onclick="return confirm('是否删除')" })</td></tr>}</table>
@{var prevDisabled = !Model.HasPreviousPage ? "disabled" : "";var nextDisabled = !Model.HasNextPage ? "disabled" : "";
}<a asp-action="StuInfoList"asp-route-pageNumber="@(Model.PageIndex - 1)"class="btn btn-default @prevDisabled">Previous
</a>
<a asp-action="StuInfoList"asp-route-pageNumber="@(Model.PageIndex + 1)"class="btn btn-default @nextDisabled">Next
</a>

11.添加新增视图(Save.cshtml)

<form action="/stu/Save2" method="post">
姓名:<input type="text" name="Name" />
年龄:<input type="text" name="Age"/>
性别:<input type="text" name="Sex"/>
<input type="submit" value="保存"/>
</form>

12.添加编辑视图(edit.cshtml)(可以和新增公用一个视图)

@using mvccore.ViewModel
@model stuViewModel;
<form action="/stu/edit2" method="post">姓名:<input type="text" name="Name" value="@Model.Name" />年龄:<input type="text" name="Age" value="@Model.Age" /><input type="hidden" name="Id" value="@Model.Id"/><input type="submit" value="保存" />
</form>

13.如果在解决方案中有多个项目的话,需要把当前项目设置为启动项目
在这里插入图片描述
14.修改项目默认起始页,默认路由是 /Home/index(根据自己的需要更改)

在这里插入图片描述
15.End 至此项目demo就完成了,下面是项目的结构图
在这里插入图片描述
代码随便写的,主要是快速入门。这边可以去微软官方文档上学习,有完整的代码实例(网址如下)
https://learn.microsoft.com/zh-cn/aspnet/core/tutorials/first-mvc-app/start-mvc?view=aspnetcore-7.0&tabs=visual-studio

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/148661.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服装服饰小程序商城的作用是什么

服装绝对算是市场重要的组成部分&#xff0c;零售批发都有大量从业者&#xff0c;随着线下流量匮乏、经营困难重重&#xff0c;很多厂家商家选择线上经营&#xff0c;主要方式是直播、入驻第三方平台等&#xff0c;同时私域节奏加快及线上平台限制等&#xff0c;不少商家也是通…

appscan的两种手动探索扫描方式

文章目录 一、使用火狐FoxyProxy浏览器代理探索二、使用appscan内置浏览器探索 一、使用火狐FoxyProxy浏览器代理探索 首先火狐浏览器需安装FoxyProxy 先在扩展和主题里搜FoxyProxy 选FoxyProxy Standard,然后添加到浏览器就行 添加后浏览器右上角会有这个插件 打开apps…

Linux系统下xxx is not in the sudoers file解决方法

文章目录 遇到问题解决方法参考 遇到问题 服务器上新建用户&#xff0c;名为lishizheng&#xff0c;现在想给该用户添加sudo权限。 $ sudo lsof -i tcp:7890 [sudo] password for lishizheng: lishizheng is not in the sudoers file. This incident will be reported.解决…

Go 语言内置类型全解析:从布尔到字符串的全维度探究

目录 一、布尔类型定义基础用法声明与初始化逻辑运算 进阶用法条件语句循环结构函数返回值 常见错误与陷阱 二、整数类型定义基础用法声明与初始化运算符位运算 进阶用法数据溢出类型转换类型推断 特殊整数类型runebyte 常见问题和陷阱 三、浮点数类型定义基础用法声明与初始化…

Junit的常用操作

注:本篇文章讲解的是junit5 目录 Juint是什么 Juint需要导入的依赖 Juint常用注解 Junit执行顺序 参数化 断言 测试套件 Juint是什么 Juint 是 Java 的一个单元测试框架. 也是回归测试框架. 使用 Junit 能让我们快速的完成单元测试。 注意&#xff1a;Junit 测试也是程序…

联合概率和条件概率的区别和联系

联合概率P(A∩B) 两个事件一起&#xff08;或依次&#xff09;发生的概率。 例如&#xff1a;掷硬币的概率是 ⁄₂ 50%&#xff0c;翻转 2 个公平硬币的概率是 ⁄₂ ⁄₂ ⁄₄ 25%&#xff08;这也可以理解为 50% 的 50%&#xff09; 对于 2 个硬币&#xff0c;样本空间将…

8章:scrapy框架

文章目录 scrapy框架如何学习框架&#xff1f;什么是scarpy&#xff1f;scrapy的使用步骤1.先转到想创建工程的目录下&#xff1a;cd ...2.创建一个工程3.创建之后要转到工程目录下4.在spiders子目录中创建一个爬虫文件5.执行工程setting文件中的参数 scrapy数据解析scrapy持久…

超市便利店批发零售小程序商城的作用是什么

超市便利店甚至是商场&#xff0c;所售卖的产品广而多&#xff0c;其线上线下商家数量也非常庞大&#xff0c;对传统超市便利店来说&#xff0c;往往会优先发力线下经营&#xff0c;然而随着互联网电商冲击&#xff0c;传统线下经营也面临&#xff1a;拓客引流难、产品销售难、…

子监督学习的知识点总结

监督学习 机器学习中最常见的方法是监督学习。在监督学习中&#xff0c;我们得到一组标记数据&#xff08;X&#xff0c;Y&#xff09;&#xff0c;即&#xff08;特征&#xff0c;标签&#xff09;&#xff0c;我们的任务是学习它们之间的关系。但是这种方法并不总是易于处理&…

Vue中如何进行拖拽与排序功能实现

在Vue中实现拖拽与排序功能 在Web应用程序中&#xff0c;实现拖拽和排序功能是非常常见的需求&#xff0c;特别是在管理界面、任务列表和图形用户界面等方面。Vue.js作为一个流行的JavaScript框架&#xff0c;提供了许多工具和库来简化拖拽和排序功能的实现。本文将介绍如何使…

算法:最近公共祖先(LCA)

有根树中&#xff0c;每一个点都有好几个祖先&#xff08;在往根节点走的过程中遇到的都是它的祖先&#xff09;&#xff0c;一般化&#xff0c;把本身也称为它的祖先 对于两个点&#xff0c;离它们最近的一个公共祖先被称为最近公共祖先 法一&#xff1a;向上标记法&#xf…

Android Studio实现简易计算器(带横竖屏,深色浅色模式,更该按钮颜色,selector,style的使用)

目录 前言 运行结果&#xff1a; 运行截屏&#xff08;p50e&#xff09; apk文件 源码文件 项目结构 总览 MainActivity.java drawable 更改图标的方法&#xff1a; blackbutton.xml bluebuttons.xml greybutton.xml orangebuttons.xml whitebutton.xml layout 布…

Lagrange插值法实验:求拉格朗日插值多项式和对应x的近似值matlab实现(内附代码)

一、实验要求 已知函数表&#xff1a; 求出Lagrange 插值多项式&#xff0c;并计算x1.2处的y的近似值。 二、MATLAB代码 求解多项式&#xff1a; X input(请输入横坐标向量X:\nX); % 获取用户输入的横坐标向量 Y input(请输入纵坐标向量Y:\nY); % 获取用户输入的纵坐标…

简单走近ChatGPT

目录 一、ChatGPT整体背景认知 &#xff08;一&#xff09;ChatGPT引起关注的原因 &#xff08;二&#xff09;与其他公司的竞争情况 二、NLP学习范式的发展 &#xff08;一&#xff09;规则和机器学习时期 &#xff08;二&#xff09;基于神经网络的监督学习时期 &…

竞赛 机器学习股票大数据量化分析与预测系统 - python 竞赛

文章目录 0 前言1 课题背景2 实现效果UI界面设计web预测界面RSRS选股界面 3 软件架构4 工具介绍Flask框架MySQL数据库LSTM 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 机器学习股票大数据量化分析与预测系统 该项目较为新颖&am…

2023计算机保研——双非上岸酒吧舞

我大概是从22年10月份开始写博客的&#xff0c;当时因为本校专业的培养方案的原因&#xff0c;课程很多&#xff0c;有些知识纸质记录很不方便&#xff0c;于是选择了打破了自己的成见使用博客来记录学习生活。对于我个人而言&#xff0c;保研生活在前一大半过程中都比较艰难&a…

System Generator学习——时间和资源分析

文章目录 前言一、目标二、步骤三、步骤 1 &#xff1a;系统生成器的时序分析1、时序分析2、解决时间违规问题 四、步骤 2 &#xff1a;系统生成器中的资源分析总结 前言 在本节实验中&#xff0c;你将学习如何通过在 Simulink 中进行仿真来验证设计的功能&#xff0c;以确保在…

MapStruct初窥门径

一、介绍 MapStruct相比于BeanUtils性能更高&#xff0c;能够实现DO&#xff0c;DTO&#xff0c;VO之间的转换&#xff0c;达到解耦合的目的 二、使用前提 添加依赖 <dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifa…

学习记忆——宫殿篇——记忆宫殿——数字编码——扑克牌记忆

扑克牌我们可以通过以下3点进行识记&#xff1a; 1、先把扑克牌进行编码转换 2、确定要进行记忆的记忆宫殿 3、把扑克牌与记忆宫殿一一对应 首先54张扑克牌除去大小王后剩下52张&#xff0c;因为世界赛不需要记忆大小王。52张扑克牌都有对应的编码&#xff0c;每2张扑克牌对应…

JVM篇---第三篇

系列文章目录 文章目录 系列文章目录一、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?二、Java内存结构三、说说对象分配规则一、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文…