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

news2024/11/25 8:16:58

说明:本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
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE 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.coloradmin.cn/o/1048621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python爬虫教程——解析网页中的元素

前言&#xff1a; 嗨喽~大家好呀&#xff0c;这里是小曼呐 ~ 在我们理解了网页中标签是如何嵌套&#xff0c;以及网页的构成之后&#xff0c; 我们就是可以开始学习使用python中的第三方库BeautifulSoup筛选出一个网页中我们想要得到的数据。 接下来我们了解一下爬取网页信息…

Java 实现前端数据的导出操作

前端 <el-button class"export" type"primary" icon"el-icon-download" click"exportData()">导出</el-button>exportData() {//data 操作data 变成后端需要的格式let data {capacityVos: resultVo}this.$confirm("…

28 drf-Vue个人向总结-1

文章目录 前后端分离开发展示项目项补充知识开发问题浏览器解决跨域问题 drf 小tips设置资源root目录使用自定义的user表设置资源路径media数据库补充删除表中数据单页面与多页面模式过滤多层自关联后端提交的数据到底是什么jwt token登录设置普通的 token 原理使用流程解析 jw…

二十,镜面IBL--打印BRDF积分贴图

比起以往&#xff0c;这节应该是最轻松的了&#xff0c; 运行结果如下 代码如下&#xff1a; #include <osg/TextureCubeMap> #include <osg/TexGen> #include <osg/TexEnvCombine> #include <osgUtil/ReflectionMapGenerator> #include <osgDB/Re…

git之merge和rebase的区别

准备 创建仓库 test-01文件 test-02文件 创建test01分支和test02分支 这里我们使用idea打开源代码 test02分支同操作 大致操作 test01分支对文件test01文件操作&#xff1a; 1.添加内容&#xff1a;test01第一次修改1 2.git commit 3.添加内容&#xff1a; test01第二次…

Arduino驱动DFPlayer Mini MP3模块

文章目录 Mini MP3模块简介产品参数引脚定义实验准备程序下载实物接线总结 Mini MP3模块 简介 DFPlayer Mini是一款小巧且价格低廉的MP3模块&#xff0c;可以直接接驳扬声器。模块配合供电电池、扬声器、按键可以单独使用&#xff0c;也可以通过串口控制&#xff0c;作为Ardui…

7.1 为什么要用函数

主要内容&#xff1a; 这段文字主要讲述了为什么要使用函数来进行程序设计&#xff0c;以及函数在程序设计中的重要性和作用。以下是这段文字的主要内容和要点&#xff1a; ### 1. **简化和清晰度** - 当程序规模较大&#xff0c;功能较多时&#xff0c;如果所有代码都写在主…

颜色+情感的英语表达还有这些,零基础学英语口语去哪里,柯桥有推荐的吗?

当我们探讨关于"blue"&#xff08;蓝色&#xff09;的多义性时&#xff0c;我们会发现英语中有许多其他词汇也有类似的双关意义。 既可以表示一种颜色或物理属性&#xff0c;又可以代表一种情感或心理状态。 这种现象在语言中很常见&#xff0c;反映了语言的丰富性和…

网址静态码手机制作教程,附图文详解!

网址的静态码是如何生成的呢&#xff1f;静态码是二维码的一种常用类型&#xff0c;一般常见的静态码类型主要是文本或者网址&#xff0c;那么在电脑制作静态码的方法相信很多小伙伴都知道怎么做&#xff0c;那么手机上制作的方法&#xff0c;大家感兴趣吗&#xff1f;下面来给…

百度主动推送不能用了,百度自动推送代码送给大家

从9月初&#xff0c;百度就开始大规模的删除网站&#xff0c;绝对大部分站长的大部分网站都失去了百度主动推送的资格&#xff0c;那么还有其他的方法推送给百度吗&#xff1f; 答案是有的&#xff0c;那就是百度自动推送。我们先来了解一下百度主动推送和百度自动推送的相关知…

【计算机网络笔记十】计算机网络面试问题总结

1. 计算机网络的各层协议及作用&#xff1f; 计算机网络体系可以大致分为一下三种&#xff0c;OSI 七层模型、TCP/IP 四层模型和五层模型。 OSI 七层模型&#xff1a;大而全&#xff0c;但是比较复杂、而且是先有了理论模型&#xff0c;没有实际应用。TCP/IP 四层模型&#x…

Fireboom on Sealos:半小时搞定一个月的接口工作

后端日常开发工作中有 88% 的接口都是 CURD&#xff0c;占用了超过 6 成开发时间。这些工作枯燥乏味&#xff0c;且价值低下&#xff0c;不仅荒废了时间&#xff0c;还无法获得任何成就感。而 Fireboom 可在 2 分钟内&#xff0c;完成传统模式下 2 天才能完成的接口&#xff0c…

实战项目:VB结合数据库实现-登录注册增删改查刷新

文章目录: 一&#xff1a;效果演示 二&#xff1a;实现思路 三&#xff1a;代码实现 form1 效果图 代码 form2 效果图 代码 form3 效果图 代码 一&#xff1a;效果演示 效果图◕‿◕✌✌✌ VB结合数据库实现-登录注册增删改查刷新 代码下载 数据库建表 外接程序—…

CISSP学习笔记:安全模型的原则、设计和功能

第八章 安全模型的原则、设计和功能 8.1 使用安全设计原则实施和管理工程过程 项目开发的早起阶段考虑安全是非常重要的 8.1.1 客体和主体 主体&#xff1a;请求访问资源的用户或进程客体&#xff1a;用户或进程想要的访问信任传递&#xff1a;A信任B并且B信任C&#xff0c…

用Python实现ROS节点(编写简单的消息发布器和订阅器)

用Python实现ROS节点(编写简单的消息发布器和订阅器) 圆圈是节点、中间的chatter是话题 可以用rosrun运行&#xff0c;也可以用python3 直接运行

leetcodetop100(29) K 个一组翻转链表

K 个一组翻转链表 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改…

什么样的人适合学习网络安全?你在其中吗?

有很多想要转行网络安全或者选择网络安全专业的人在进行决定之前一定会有的问题&#xff1a;什么样的人适合学习网络安全&#xff1f;我适不适合学习网络安全&#xff1f; 会产生这样的疑惑并不奇怪&#xff0c;毕竟网络安全这个专业在2017年才调整为国家一级学科&#xff0c;…

施耐德电气:勾勒未来工业愿景,赋能中国市场

9月19日&#xff0c;第23届中国国际工业博览会&#xff08;简称“工博会”&#xff09;在上海隆重召开。作为全球能源管理和自动化领域的数字化转型专家&#xff0c;施耐德电气在工博会现场全方位展现了自身对未来工业的全新视野与深刻见解&#xff0c;不仅展示了其贯通企业设计…

中药材商城小程序的作用是什么

古往今来中药材的作用非常大&#xff0c;无论中医院还是相关药材作坊都会有大量人购买&#xff0c;随着互联网电商拓展更多商品类目&#xff0c;中药材也可以通过线上销售&#xff0c;让消费者随时购买到所需商品&#xff0c;商家也能获得更多生意。 那么通过【雨科】平台搭建中…

二、2023.9.28.C++基础endC++内存end.2

文章目录 17、说说new和malloc的区别&#xff0c;各自底层实现原理。18、 说说const和define的区别。19、 说说C中函数指针和指针函数的区别&#xff1f;20、 说说const int *a, int const *a, const int a, int *const a, const int *const a分别是什么&#xff0c;有什么特点…