ASP.NET Core 打造一个简单的图书馆管理系统 (修正版)(七) 学生信息增删(伪终章)

前言:

本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作。

本系列文章主要参考资料:

微软文档:https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/?view=aspnetcore-2.1&tabs=windows

《Pro ASP.NET MVC 5》、《锋利的 jQuery》

此系列皆使用 VS2017+C# 作为开发环境。如果有什么问题或者意见欢迎在留言区进行留言。

项目 github 地址:https://github.com/NanaseRuri/LibraryDemo

本章内容:Ajax 提交自定义对象、Ajax 提交数组

此处全部都在 /AdminAccount/Index 页面完成。

一、学生信息编辑首页

创建一个 Admin 控制器用于编辑学生信息:

 1     [Authorize(Roles = "Admin")]
 2     public class AdminAccountController : Controller
 3     {
 4         private UserManager<Student> _userManager;
 5
 6         public AdminAccountController(UserManager<Student> userManager)
 7         {
 8             _userManager = userManager;
 9         }
10
11         public IActionResult Index()
12         {
13             ICollection<Student> students = _userManager.Users.ToList();
14             return View(students);
15         }
16     }

视图:

@using LibraryDemo.Models.DomainModels
@model IEnumerable<LibraryDemo.Models.DomainModels.Student>
@{
    ViewData["Title"] = "AccountInfo";
    Student stu = new Student();
}
<link rel="stylesheet" href="~/css/BookInfo.css" />

<h2>学生信息</h2>

<div id="buttonGroup">
    <button class="btn btn-primary" onclick="return addStudent()">添加学生</button>
    <button class="btn btn-danger" onclick="return confirmDelete()">删除学生</button>
</div>

<br />
<table>
    <thead>
        <tr>
            <th></th>
            <th>@Html.LabelFor(m => stu.UserName)</th>
            <th>@Html.LabelFor(m => stu.Name)</th>
            <th>@Html.LabelFor(m => stu.Degree)</th>
            <th>@Html.LabelFor(m => stu.PhoneNumber)</th>
            <th>@Html.LabelFor(m => stu.Email)</th>
            <th>@Html.LabelFor(m => stu.MaxBooksNumber)</th>
        </tr>
    </thead>
    <tbody id="studentList">

        @if (!@Model.Any())
        {
            <tr><td colspan="6">未有学生信息</td></tr>
        }
        else
        {
            foreach (var student in Model)
            {
                <tr>
                    <td><input type="checkbox" name="userNames" value="@student.UserName" /></td>
                    <td>@student.UserName</td>
                    <td>@student.Name</td>
                    <td>@Html.DisplayFor(m => student.Degree)</td>
                    <td>@student.PhoneNumber</td>
                    <td>@student.Email</td>
                    <td>@student.MaxBooksNumber</td>
                </tr>
            }
        }
    </tbody>
</table>

结果:

二、增加新学生

此处打算使用 Ajax 来实现无刷新页面更新,因此动作方法返回类型为 Json 。

动作方法:

此处需注意在参数处添加 [FromBody] 修饰,否则无法读取来自页面的数据。

为节省带宽,此处仅返回添加的学生的 JSON 。

 1         [HttpPost]
 2         public async Task<JsonResult> AddStudent([FromBody]Student student)
 3         {
 4             if (_userManager.CreateAsync(student,"123456").Result.Succeeded)
 5             {
 6                 return await AddedStudent(student.UserName);
 7             }
 8
 9                 return Json("Failed");
10         }
11
12         public async Task<JsonResult> AddedStudent(string userName)
13         {
14             Student student=await _userManager.Users.FirstOrDefaultAsync(s => s.UserName == userName);
15             return Json(new
16             {
17                 userName = student.UserName,
18                 name = student.Name,
19                 degree = student.Degree == Degrees.CollegeStudent ? "本科生" : (student.Degree == Degrees.Postgraduate ? "研究生" : "博士生"),
20                 phoneNumber = student.PhoneNumber,
21                 email = student.Email,
22                 maxBooksNumber = student.MaxBooksNumber
23             });
24         }

在视图中添加 JS 代码:

此处 JS 代码先是点击 添加书籍 按钮插入一行用于编辑的区域,然后通过插入区域的提交按钮提交信息,在信息成功返回后删除原来进行编辑的行,通过返回的信息添加新的行。

27-33 中由于 ASP.NET Core 后台返回 JSON 数据时会对数据的键的首字母进行小写处理,因此此处读取属性也是使用首字母小写,在后台的键也是使用首字母小写加以强调。

 1 <script>
 2     function postAddStudent() {
 3         $.ajax({
 4             url: "@Url.Action("AddStudent")",
 5             contentType: "application/json",
 6             method: "POST",
 7             data: JSON.stringify({
 8                 UserName: $("#UserName").val(),
 9                 Name: $("#Name").val(),
10                 Degree:$("#Degree").val(),
11                 PhoneNumber: $("#PhoneNumber").val(),
12                 Email: $("#Email").val(),
13                 MaxBooksNumber: $("#MaxBooksNumber").val()
14             }),
15             success: function (student) {
16                 addStudentToTable(student);
17             }
18         });
19     }
20
21     function addStudentToTable(student) {
22         var studentList = document.getElementById("studentList");
23         var studentInfo = document.getElementById("studentInfo");
24         studentList.removeChild(studentInfo);
25
26         $("#studentList").append(`<tr>` +
27             `<td><input type="checkbox" name="userNames" value="${student.userName}" /></td>` +
28             `<td>${student.userName}</td>` +
29             `<td>${student.name}</td>`+
30             `<td>${student.degree}</td>` +
31             `<td>${student.phoneNumber}</td>` +
32             `<td>${student.email}</td>` +
33             `<td>${student.maxBooksNumber}</td >` +
34             `</tr>`);
35     }
36 </script>

结果:

三、 批量移除学生

此处亦可以只返回更新过的元素,但为了演示 ASP.NET Core 使用 Ajax 对数组进行处理,故返回新的 Student 列表:

 1         [HttpPost]
 2         public async Task<JsonResult> RemoveStudent([FromBody]IEnumerable<string> userNames)
 3         {
 4             Student removedStudent;
 5             foreach (var userName in userNames)
 6             {
 7                 removedStudent =await _userManager.FindByNameAsync(userName);
 8                 if (removedStudent!=null)
 9                 {
10                     await _userManager.DeleteAsync(removedStudent);
11                 }
12             }
13             return GetStudentData();
14         }
15
16         public JsonResult GetStudentData()
17         {
18             var students = _userManager.Users.Select(s =>new
19             {
20                 userName=s.UserName,
21                 name=s.Name,
22                 degree=s.Degree==Degrees.CollegeStudent?"本科生":(s.Degree==Degrees.Postgraduate?"研究生":"博士生"),
23                 phoneNumber = s.PhoneNumber,
24                 email = s.Email,
25                 maxBooksNumber = s.MaxBooksNumber
26             });
27             return Json(students);
28         }

视图添加 JS 函数:

18 行为数组元素的提交方式,不需像之前一样—— {values:values},否则无法进行数据绑定而导致后台接收到空数据。

为了对表格进行更新,先是通过 jQuery 获取了 tbody 的部分,清空后添加来自后台的新信息:

 1 <script>
 2     function confirmDelete() {
 3         var userNames = document.getElementsByName("userNames");
 4         var message = "确认删除";
 5         var values = [];
 6         for (i in userNames) {
 7             if (userNames[i].checked) {
 8                 message = message + userNames[i].value+",";
 9                 values.push(userNames[i].value);
10             }
11         }
12         message = message + "?";
13         if (confirm(message)) {
14             $.ajax({
15                 url: "@Url.Action("RemoveStudent")",
16                 contentType: "application/json",
17                 method: "POST",
18                 data: JSON.stringify(values),
19                 success: function(students) {
20                     updateTable(students);
21                 }
22             });
23         }
24     }
25
26     function updateTable(data) {
27         var body = $("#studentList");
28         body.empty();
29         for (var i = 0; i < data.length; i++) {
30             var person = data[i];
31             body.append(`<tr><td><input type="checkbox" name="userNames" value="${person.userName}" /></td>
32             <td>${person.userName}</td><td>${person.name}</td><td>${person.degree}</td>
33             <td>${person.phoneNumber}</td><td>${person.email}</td><td>${person.maxBooksNumber}</td></tr>`);
34         }
35     };
36 </script>

结果:

原文地址:https://www.cnblogs.com/gokoururi/p/10398023.html

时间: 2024-10-03 00:54:21

ASP.NET Core 打造一个简单的图书馆管理系统 (修正版)(七) 学生信息增删(伪终章)的相关文章

ASP.NET Core 打造一个简单的图书馆管理系统(九) 学生信息增删(终章)

前言: 本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作. 本系列文章主要参考资料: 微软文档:https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/?view=aspnetcore-2.1&tabs=windows <Pro ASP.NET MVC 5>.<锋利的 jQuery> 当此系列文章写完后会在一周内推出修正版. 此系列皆使用 VS2017+C# 作为开发环境.如果

ASP.NET Core 打造一个简单的图书馆管理系统(八)学生借阅/预约/查询书籍事务

前言: 本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作. 本系列文章主要参考资料: 微软文档:https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/?view=aspnetcore-2.1&tabs=windows <Pro ASP.NET MVC 5>.<锋利的 jQuery> 当此系列文章写完后会在一周内推出修正版. 此系列皆使用 VS2017+C# 作为开发环境.如果

ASP.NET Core 打造一个简单的图书馆管理系统(三)基本登录页面以及授权逻辑的建立

前言: 本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作. 本系列文章主要参考资料: 微软文档:https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/?view=aspnetcore-2.1&tabs=windows <Pro ASP.NET MVC 5>.<Bootstrap 开发精解>.<锋利的 jQuery> 此系列皆使用 VS2017+C# 作为开发环境.

ASP.NET Core 打造一个简单的图书馆管理系统(四)密码修改以及密码重置

 前言: 本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作. 本系列文章主要参考资料: 微软文档:https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/?view=aspnetcore-2.1&tabs=windows <Pro ASP.NET MVC 5>.<Bootstrap 开发精解>.<锋利的 jQuery> 此系列皆使用 VS2017+C# 作为开发环境

ASP.NET Core 打造一个简单的图书馆管理系统(五)初始化书籍信息

前言: 本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作. 本系列文章主要参考资料: 微软文档:https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/?view=aspnetcore-2.1&tabs=windows <Pro ASP.NET MVC 5>.<锋利的 jQuery> 此系列皆使用 VS2017+C# 作为开发环境.如果有什么问题或者意见欢迎在留言区进行留言.

ASP.NET Core 打造一个简单的图书馆管理系统(七)外借/阅览图书信息的增删改查

前言: 本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作. 本系列文章主要参考资料: 微软文档:https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/?view=aspnetcore-2.1&tabs=windows <Pro ASP.NET MVC 5>.<锋利的 jQuery> 此系列皆使用 VS2017+C# 作为开发环境.如果有什么问题或者意见欢迎在留言区进行留言.

[.NET] 一步步打造一个简单的 MVC 网站 - BooksStore

一步步打造一个简单的 MVC 网站 - BooksStore 简介 主要功能与知识点如下: 分类.产品浏览.购物车.结算.CRUD(增删改查) 管理.分页和单元测试. [备注]项目使用 VS2015 + C#6 进行开发. 一.创建项目架构 1.新建一个解决方案“BooksStore”,并添加以下项目: BooksStore.Domain:类库,存放域模型和逻辑,使用 EF: BooksStore.WebUI:Web 应用程序,存放视图和控制器,充当显示层: BoosStore.UnitTest

ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程

原文:ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 动作结果 前面的章节中,我们一直使用简单的 C# 类作为控制器. 虽然这些类不是从基类派生的,但仍然可以在 MVC 中使用这种方法. 当然了,对于控制器,但更常见的做法是从 Microsoft.AspNetCore.Mvc 命名空间中提供的控制器基类中派生控制器.本章中,我们将尝试这么做,并且学习动作结果 ( Action Results ). 动作结果 ( Act

ASP.NET Core 设置和初始化数据库 - ASP.NET Core 基础教程 - 简单教程,简单编程

原文:ASP.NET Core 设置和初始化数据库 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 设置和初始化数据库 上一章节中我们已经设置和配置好了 EF 框架服务,本章节我们就来学习如何使用 EF 框架设置和初始化数据库 初始化数据库 初始化数据库的方法之一是使用 EF 框架来创建数据库,仅仅需要两步就能完成 第一步,给我们的 HelloWorld 项目添加迁移 ( migration ) 代码 迁移代码是 C# 代码,用来在数据库系统中创建数据库