.net Core 自我学习随笔(四)——工作的核心:增删改查

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yangzhencheng_001/article/details/54693181

上次介绍了一下如何进行连接数据库,我们连了一个 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{} 里。

展开阅读全文

没有更多推荐了,返回首页