.net Core 自我学习随笔——工作的核心:增删改查
Posted 神密者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.net Core 自我学习随笔——工作的核心:增删改查相关的知识,希望对你有一定的参考价值。
上次介绍了一下如何进行连接数据库,我们连了一个 SQL Server 试了试,感觉还是比较良好的。
但是有人说,不会数据库操作。什么怎么怎么查询,怎么怎么插入(上次不是演示了吗?),还有怎么怎么修改,对了删除不了怎么办。什么怎么样,该怎么办就怎么办——汪。。。
一、查:
查,是我们常用的操作。比如,向用户展示相关信息,相关的数据等等。怎么操作呢?我们来一步一步进行操作。
first:我们先把 Home/IndexController 与 View/index.cshtml 里面的进行修改,代码如下:
先改 HomeController:
using System;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
namespace testProject.Controllers
public class HomeController : Controller
Model.myDataBase db = new Model.myDataBase();
public IActionResult Index()
var userlist = from u in db.Users
select u;
ViewBag.userList = userlist;
ViewBag.userCount = userlist.Count();
return View();
1、Model.myDataBase db = new Model.myDataBase();
不必说了,我们先准备好数据库对象,以遍进行数据库操作,所以,我把其作为类的一个属性,而不是方法里面的变量。这样可以在需要时直接调用。
2、public IActionResult Index()
这就相当于原来 .net 里的 public ActionResult Index()。在 .net core 中,全是在 ActionResult 前面加个“I”。其它的都一样啦。
3、var userlist = from u in db.Users select u;
这个就是执行 Linq 进行查询操作。
4、ViewBag.xxx 就是向视图(View)进行数据传输,也就是向前端传输显示的内容。
我们已经知道了有“public IActionResult Index()”,就要在视图(View)中建立一个对应的 index.cshtml,那我们建立一下,具体代码如下:
Views/Home/index.cshtml
@
ViewData["Title"] = "主页";
<style type="text/css">
.tableStyleBorder margin: 0px auto; margin-top: 30px; border-collapse: collapse; border: 1px solid Black;
.tableStyleBorder th, .tableStyleBorder td min-width: 80px; text-align: center; padding: 8px; border: 1px solid Black;
</style>
<table class="tableStyleBorder">
<tr>
<th>ID</th>
<th>姓名</th>
<th>创建时间</th>
</tr>
@if(0 < ViewBag.userCount)
@foreach (var item in ViewBag.userList)
<tr>
<td>@item.id</td>
<td>@item.name</td>
<td>@item.createtime</td>
</tr>
else
<tr>
<td colspan="3">没有数据</td>
</tr>
</table>
1、ViewBag.xxx 就是对应“控制器”(Controller 文件夹中的 CS 文件里)中的 ViewBag.xxx(见 HomeController.cs)。执行顺便是,先执行 控制器,得到的数据通过 ViewBag 传给 index.cshtml。
2、@if、@foreach:前者判断,后者遍历。其实有些 .net 基础的都能看明白。如果看不明白,请查书——最基础的知识呀~~~
执行结果:
二、增:
增加我们已经知道了,只不过,我们做得再好一些。让数据从前端传过来。因为,我们为此要做一个“控制器”和一个“视图”。
HomeController 增加一个方法:
[HttpGet]
public IActionResult writeUser()
return View();
这里我们看到比之前的 index() 多了一个 [HttpGet],这个是指定只有 Get 才能访问的意思。为什么要加这个,我们在后面写入数据库时,就能看出来了。
建立对应的视图
Views/Home/writeUser.cshtml:
<div style="margin-top: 30px;">
@using (Html.BeginForm("writeUser", "Home", FormMethod.Post))
<label>姓名:</label>
@Html.TextBox("username")
<input type="submit" id="btnSubmit" name="btnSubmit" />
</div>
其中 Html.BeginForm 与 HTML 中的 form 标签 是一个意思,FormMethod.Post 就是 method=”post”。而 “writeUser”, “Home”,就是 Home/writeUser。如果有 .net MVC 基础的一看就明白了。其实与原来的没有区别。@Html.TextBox,就是 input name=”text” 这标签。
这里完全也可以用 HTML 来写,也没有区别:
<div style="margin-top: 30px;">
<from action="/Home/writeUser" method="post">
<label>姓名:</label>
<input type="text" id="username" name="username" />
<input type="submit" id="btnSubmit" name="btnSubmit" />
</form>
</div>
以上的执行效果是:
通过上面的代码,我们知道,在你点击提交时,代码会转到 Home/writeUser,但 writeUser 只支持 Get 方式访问,但这里是 post 提交数据,所以我们这时要在“控制器”中来个函数重载,代码如下:
[HttpPost]
public string writeUser(string username = "")
string _name = System.Net.WebUtility.HtmlEncode(username.Trim());
if(0 == _name.Length)
return "操作失败!";
Model.dbo.MyUser user = new Model.dbo.MyUser
name = _name,
createtime = DateTime.Now
;
db.Users.Add(user);
db.SaveChanges();
Response.Redirect(Url.Action("Index", "Home"));
return "";
其中,这里有一个“System.Net.WebUtility.HtmlEncode”,他是相当于之前 MVC 中的 Server.HtmlEncode,对传过来的参数进行处理,以防止别人传来一些危险字符,造成数据库问题。
上面已经不是[HttpGet],而是[HttpPost],说明必须是 Post 方式防问。好的,我们执行一下看看:
点击提交后的执行结果:
三、改:
能查看,能增加,那么就必须能修改了。修改一般要在查的基础之上。如果不查,是不可能修改的,因为你不知道修改谁,怎么确定修改的对象。就像找小姐,你不可能找个长得比较难看的,一般都有一个硬性需求,再找。有时找一个,有时找两以上。找一个就男女单打,两个是斗地主,三个就是麻将。
因为,为了以查为基础,所以,我们要修改一下 Index 的内容——也就是加一个操作列。
<style type="text/css">
.tableStyleBorder margin: 0px auto; margin-top: 30px; border-collapse: collapse; border: 1px solid Black;
.tableStyleBorder th, .tableStyleBorder td min-width: 80px; text-align: center; padding: 8px; border: 1px solid Black;
</style>
<table class="tableStyleBorder">
<tr>
<th>ID</th>
<th>姓名</th>
<th>创建时间</th>
<th>操作</th>
</tr>
@if(0 < ViewBag.userCount)
@foreach (var item in ViewBag.userList)
<tr>
<td>@item.id</td>
<td>@item.name</td>
<td>@item.createtime</td>
<td><a href="/Home/updateInfo?id=@item.id">修改</a></td>
</tr>
else
<tr>
<td colspan="3">没有数据</td>
</tr>
</table>
这里加了一个“<th>操作</th>”和“<td><a href=”/Home/updateInfo?id=@item.id”>修改</a></td>”,用这种方式来连接修改页面。
那么好,万事俱备,只差修改。我们现在来做修改页面,我们起名为“updateInfo”,这个名字可以从 A 标签中看出来!^^
修改页,起先要先做个展示页,之后才是修改,与“增”操作相似。只不过要在原来的输入数据的页面中进行一次查询相应值,这是为了如果数据特别多的话,不可能每一个都要进行修改,可能只改几个的。
先看修改页面的用户界面,分为:视图(View)与 [HttpGet] 的控制器(Controller)
Views/Home/updateInfo.cshtml:
<div style="margin-top: 30px;">
@using (Html.BeginForm("updateInfo", "Home", FormMethod.Post))
<label>姓名:</label>
string _username = ViewBag.Name;
@Html.TextBox("username", _username);
<input type="hidden" id="id" name="id" value="@ViewBag.ID" />
<input type="submit" id="btnSubmit" name="btnSubmit" />
</div>
我们可以看出从控制器中传来了两个值:ViewBag.XXX。因为在 @Html 中不能直接使用 ViewBag.Name,所以要用“string _username = ViewBag.Name;”嘚瑟一下。
再看看 HomeController 中,我们又加了什么:
[HttpGet]
public IActionResult updateInfo(int id = 0)
var user = (from u in db.Users
where u.id == id
select u).FirstOrDefault();
if(null == user)
return RedirectToAction("Error");
ViewBag.ID = id;
ViewBag.Name = user.name;
return View();
这里看到视图(View)中的 ViewBag 的实现。再看看,我们发现了一个奇怪的一段:
if(null == user)
return RedirectToAction("Error");
这一段是通过对数据库表 Users 查询后,通过 FirstOrDefault() 方法取到第一个值。但是,如果查询为空的话,那么取到的第一个值就是为 null,这里是为了防止没有数据的情况下出错。
这里稍稍介绍一下,如果在使用 Linq 进行查询后,没有用 FirstOrDefault() 的话,来判断是否有数据,而不是通过与 null 进行对比,而是通过 Count() 方法判断是否为 0。
而“return RedirectToAction(“Error”);”就是跳转的意思,跳转到同控制器下的 Error 视图(View)中。而这个视图,我们可以不用做控制器——就是显示一行字而已:
Views/Home/Error.cshtml:
<div style="text-align: center;"><h1>页面错误!</h1></div>
整个执行的页面样式就是:
好现在修改页面已经做好了。当我们点击提交时,就应该交由系统来进行修改操作了。这个,与“增”一样,完全在控制器中执行:
[HttpPost]
public string updateInfo(int id = 0, string username = "")
string _name = System.Net.WebUtility.HtmlEncode(username.Trim());
var user = (from u in db.Users
where u.id == id
select u).FirstOrDefault();
if (null == user && 0 == _name.Length)
Response.Redirect(Url.Action("Error", "Home"));
return "";
user.name = _name;
db.SaveChanges();
Response.Redirect(Url.Action("Index", "Home"));
return "";
我们执行一下。首先,我们在 Index 里选择找二条数据,并点击那一行的“修改”:
在进入的修改页面中,将 123 改成 abc,并点击“提交”按钮。
之后,系统自动执行并显示最终结果 ->Index
修改操作就这样子了。
四、删:
最后一项了,终于到了删了。删除也是必要操作,但是是属于危险性操作,因为可能整不好数据就没了。好了,现在我们开始准备删除操作。
准备与“改”一样,就是在操作那一列中再加个“删除”即可:
@
ViewData["Title"] = "主页";
<style type="text/css">
.tableStyleBorder margin: 0px auto; margin-top: 30px; border-collapse: collapse; border: 1px solid Black;
.tableStyleBorder th, .tableStyleBorder td min-width: 80px; text-align: center; padding: 8px; border: 1px solid Black;
</style>
<table class="tableStyleBorder">
<tr>
<th>ID</th>
<th>姓名</th>
<th>创建时间</th>
<th>操作</th>
</tr>
@if(0 < ViewBag.userCount)
@foreach (var item in ViewBag.userList)
<tr>
<td>@item.id</td>
<td>@item.name</td>
<td>@item.createtime</td>
<td>
<a href="/Home/updateInfo?id=@item.id">修改</a>
|
<a href="/Home/delInfo?id=@item.id">删除</a>
</td>
</tr>
else
<tr>
<td colspan="3">没有数据</td>
</tr>
</table>
从上面,我们能看出来,删除是调用 delInfo。因为是删除,不需要显示什么,所以直接在“控制器”(Controller)中进行操作即可,代码如下:
public string delInfo(int id = 0)
var user = (from u in db.Users
where u.id == id
select u).FirstOrDefault();
if (null == user)
Response.Redirect(Url.Action("Error", "Home"));
return "";
db.Users.Attach(user);
db.Users.Remove(user);
db.SaveChanges();
Response.Redirect(Url.Action("Index", "Home"));
return "";
我们点击一下第二行的“删除”看看效果:
OK,增删改查全部完成。有一件需要说明一下。在批量操作时,“db.SaveChanges();”在方法中最好在一批次中,只执行一次,不然会出现死锁,比如:
foreach(var item in userlist)
item.name = "1111";
db.SaveChanges();
千万不要把 db.SaveChanges() 写到 foreach 里。
以上是关于.net Core 自我学习随笔——工作的核心:增删改查的主要内容,如果未能解决你的问题,请参考以下文章