• MVC学习之简单的CRUD


    1.一点知识的总结

    (1)MVC将展示页面和后台处理逻辑分离,不像ASPX中展示页面继承自后台的cs页面,MVC展示页面继承自ViewPage<dynamic>,最终继承自Page(使用ASPX模板引擎可以看到这种继承关系)

    (2)因为没有了继承关系,前后台的信息传递不能使用protected的成员变量进行传递,MVC使用ViewDate,进行数据的传递

            ViewData["UserInfo"]=User;

     (3)  MVC提供了一个ViewData.Model,进行数据的传递,可以大大简化书写的代码,提高准确性,方便开发。

        使用ASPX引擎的话,需要将ViewPage<dynamic>改为ViewPage<UserInfo>,然后只要在后台对Model赋值之后,前台就可以点出来,,这就是强类型页面,同时使用Rasor引擎的话可以直接在添加视图的时候,同时选中强类型页面的勾选,然后选定相应的model即可。

    (4)对于初次加载页面和post提交页面,对于ASPX存在一个IsPostBack属性,进行判断,MVC没有,当然可以使用隐藏域自己手写一个postback判断属性,然而MVC中提供了更加简单的方式,可以使用相应的特性进行标记。(HttpPost、HttpGet、HttpDelete、HttpPut等)

    public ActionResult Index()

    {

    return View();

    }

    [HttpPost]

    public ActionResult Index(User user)

    {

    }

    (4)  如何确定删除的ID呢,在ASPX中可以使用URL进行传递?Id=12,同样在MVC中也是可以使用这种方式进行传递的,然后使用Reques进行接收即可,当然可以在Routeconfig中看到对于MVC的地址还有第三个参数ID,所以可以直接/Home/Index/12,就可以了,然后MVC的强大之处就是已经实现了相应的映射,只需要在Index(int Id ),名称必须和路由规则中名称一致,但是这种方式只能传递一个参量,想要传递多个可以使用?UserName=dd&&UseAge=22.

    2.CRUD的简单实现

    (1)查

    后台
     public ActionResult Index()
            {
                //获取数据
                IQueryable<Teacher> teacherList = dbContext.Teacher.Where<Teacher>(t => true);
                StringBuilder sb = new StringBuilder();
                foreach (Teacher teacher in teacherList)
                {
                    sb.Append(string.Format("<tr><td>{0}</td><td>{1}</td><td>{2}</td><td>{3}</td><td>{4}</td><td>{5}</td><td><a href='/home/Update/{6}'>修改</a><a href='/Home/Delete/{6}' class='delete'>删除</a></td></tr>", teacher.TeacherId, teacher.LoginId, teacher.LoginPwd, teacher.TeacherName, teacher.Sex, teacher.Birthday, teacher.TeacherId));
                }
                ViewData["teacherInfo"] = sb.ToString();
                return View();
            }
    
    前台
    <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
    <%@ Import Namespace="MVCCRUD.Models"  %>
    <!DOCTYPE html>
    
    <html>
    <head runat="server">
        <meta name="viewport" content="width=device-width" />
        <title>教职员工的列表</title>
        <script>
            window.onload= function () {
                var element = document.getElementsByClassName("delete");
                for(var i=0;i<element.length;i++)
                {
                    element[i].onclick= function () {
                        if (!confirm("确定要删除吗"))
                            return false;
                    }
                }
            }
        </script>
        </head>
    <body>
        <div>
            <a href="/Home/AddUser">添加</a>
            <table>
                <th>ID</th><th>登录ID</th><th>登录密码</th><th>姓名</th><th>性别</th><th>生日</th><th>操作</th>
                 <%=ViewData["teacherInfo"].ToString() %>
            </table>
        </div>
    </body>
    </html>
    对于前台的数据使用的是在后台直接将字符串拼接出来,当然可以直接将从数据中获取的数据复制给ViewData,然后直接在前台页面将ViewData转为IQuerable<Teacher>,,然后在前台foreach遍历显示即可

    (2)添加

    后台
     public ActionResult AddUser()
            {
                return View();
            }
            [HttpPost]
            public ActionResult AddUser(Teacher teacher)
            {
                //添加数据
                teacher.Birthday = DateTime.Now;
                dbContext.Teacher.Add(teacher);
                int count = dbContext.SaveChanges();
                if (count > 0)
                {
                    return RedirectToAction("Index");
                }
                else
                {
                    return Content("添加失败!");
                }
    
            }
    
    前台
    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>AddUser</title>
    </head>
    <body>
        <div>
            <form action="/Home/AddUser" method="post">
                登录名:<input type="text" name="LoginId"><br>
                登录密码:<input type="password" name="LoginPwd" /><br>
                姓名:<input type="text" name="TeacherName"><br>
                性别:<input type="text" name="Sex"><br>
                用户状态:<input type="text" name="UserStateId"><br>
                <input type="submit" value="添加">
            </form>
        </div>
    </body>
    </html>
    

     (3)修改

    后台
      public ActionResult Update(int id)
            {
                //获取取数据
                Teacher teacher = dbContext.Teacher.FirstOrDefault(t => t.TeacherId == id);
                ViewData["teacherInfo"] = teacher;
                return View();
            }
            [HttpPost]
            public ActionResult Update(Teacher teacher)
            {
                teacher.Birthday = DateTime.Now;
                dbContext.Entry<Teacher>(teacher
                   ).State = EntityState.Modified;//完成映射并且将内存数据库中的数据处理好
                int count = dbContext.SaveChanges();
                if (count > 0)
                {
                    return Redirect("/Home/Index");
                }
                else
                {
                    return Content("修改失败");
                }
            }
    
    前台
    @{
        Layout = null;
    }
    
        <!DOCTYPE HTML>
    
        <html>
        <head>
            <meta name="viewport" content="width=device-width" />
            <title>Update</title>
        </head>
        <body>
            @{ MVCCRUD.Models.Teacher teacher = ViewData["teacherInfo"] as MVCCRUD.Models.Teacher; }
            <div>
                <form action="/Home/Update" method="post">
                    <input type="hidden" name="teacherId" value="@teacher.TeacherId">
                    登录名:<input type="text" name="LoginId" value="@teacher.LoginId"><br>
                    登录密码:<input type="password" name="LoginPwd" value="@teacher.LoginPwd" /><br>
                    姓名:<input type="text" name="TeacherName" value="@teacher.TeacherName"><br>
                    性别:<input type="text" name="Sex" value="@teacher.Sex"><br>
                    用户状态:<input type="text" name="UserStateId" value="@teacher.UserStateId"><br>
                    <input type="submit" value="修改">
                </form>
            </div>
        </body>
    </html>
    

     (4)删除

    后台:
      public ActionResult Delete(int id)
            { 
                Teacher teacher=dbContext.Teacher.Find(id);
                dbContext.Teacher.Remove(teacher);
                int count =dbContext.SaveChanges();
                if (count > 0)
                {
                    return Redirect("/Home/Index");
                }
                else 
                {
                    return Content("删除失败");
                }
    
            }
    
    前台:
    Js 代码写在了展示页面
    

     3.结尾之言

    以上只是简单的实现了CRUD功能,仅仅是一个演示作用,MVC其实已经做好了以上的CRUD操作,也就是在添加控制器的时候,可以选择添加带有读写操作的控制器,MVC已经将读写的前后台程序全部已经写好了。我选择的空的MVC控制器,所以增删改查都得自己添加,包括后天的逻辑得自己写。

  • 相关阅读:
    Plugs介绍(翻译) .net/C#开源操作系统学习系列六
    Cosmos的里程碑2(Mile Stone 2)之浅尝PCI总线、设备编程.net/C#开源操作系统学习系列九
    [翻译] WindowsPhoneGameBoy模拟器开发二Rom文件分析
    Cosmos开篇、本系列目录.net/C#开源操作系统学习系列一
    Cosmos的汇编级调试器(翻译) .net/C#开源操作系统学习系列七
    数据库牛人榜(随时更新)
    redis大key删除
    Linux LVM硬盘管理及LVM扩容
    Linux学习之CentOS(十一)CentOS6.4下Samba服务器的安装与配置
    Linux学习之CentOS(三十)SELinux安全系统基础
  • 原文地址:https://www.cnblogs.com/XZhao/p/6617657.html
Copyright © 2020-2023  润新知