MVC增删查改,从数据库到后台,到前端,整个复习一下
就当是记笔记吧,这里,就不讲什么版式了,首先上数据库脚本,这个是我这次练习用到的数据库脚本:
USE [DB_USERS] GO /****** Object: Table [dbo].[Student] Script Date: 10/31/2015 16:44:06 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[Student]( [s_ID] [INT] IDENTITY(1,1) NOT NULL, [s_Name] [NVARCHAR](10) NULL, [s_Sex] [CHAR](2) NULL, [s_Age] [INT] NULL, [c_ID] [INT] NOT NULL, CONSTRAINT [PK__Studnet__2F3DA3BC267ABA7A] PRIMARY KEY CLUSTERED ( [s_ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO ALTER TABLE [dbo].[Student] WITH CHECK ADD FOREIGN KEY([c_ID]) REFERENCES [dbo].[Classes] ([c_ID]) GO
USE [DB_USERS] GO /****** Object: Table [dbo].[Classes] Script Date: 10/31/2015 16:44:51 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Classes]( [c_ID] [INT] NOT NULL, [c_Name] [NVARCHAR](50) NULL, PRIMARY KEY CLUSTERED ( [c_ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
下面就是后台的代码了:
1 using MVCFirstApp.Models; 2 using System; 3 using System.Collections.Generic; 4 using System.Data; 5 using System.Data.Entity.Infrastructure; 6 using System.Linq; 7 using System.Web; 8 using System.Web.Mvc; 9 10 namespace MVCFirstApp.Controllers 11 { 12 public class StudentController : Controller 13 { 14 15 public StudentController() 16 17 { 18 //关闭实体验证 19 db.Configuration.ValidateOnSaveEnabled = false; 20 } 21 DB_USERSEntities db = new DB_USERSEntities(); 22 // 23 // GET: /Student/ 24 25 public ActionResult Index() 26 { 27 28 List<Student> list = db.Student.Include("Classes").ToList(); 29 30 return View(list); //将list对象传给视图里的Model属性 31 } 32 33 /// <summary> 34 /// 35 /// </summary> 36 /// <returns></returns> 37 //public ActionResult Delete(int id) //这里的id要和路由里面的id参数一样,不区分大小写 38 //{ 39 40 // Student stu = new Student() { s_ID = id }; 41 42 // #region 删除的方法之一 43 // //删除的方法之一 44 // //加入到数据上下文中 45 // //使用Remove方法删除。必须先Attach 46 47 // //db.Student.Attach(stu); 48 // //db.Student.Remove(stu); 49 50 51 // //db.SaveChanges(); //保存到数据库 52 // #endregion 53 54 // #region 删除的方法之二 55 // //用过上下文对象的Entity方法,来把对象加入到EF中 56 // DbEntityEntry entry = db.Entry<Student>(stu); 57 58 // entry.State = EntityState.Deleted; 59 // db.SaveChanges();//保存到数据库 60 61 // #endregion 62 63 // // return Redirect("/Student/Index"); 64 65 // return RedirectToAction("index"); //删除的时候,调用重定向方法,有一个缺点,就是不知道是删除成功还是失败 66 67 // //删除的时候,我们还可以使用js代码,向用户返回删除成功还是失败 68 // //Response.Write("<script></script>"); 69 70 //} 71 72 73 /// <summary> 74 /// 删除 75 /// </summary> 76 /// <param name="id"></param> 77 public void Delete(int id) //这里的id参数必须要和路由里面的id参数一样,才可以,将参数id传到控制器方法,不过不区分大小写,即写ID也行 78 { 79 80 Student stu = new Student() { s_ID = id }; 81 82 #region 删除的方法之一 83 //删除的方法之一 84 //加入到数据上下文中 85 //使用Remove方法删除。必须先Attach 86 87 //db.Student.Attach(stu); 88 //db.Student.Remove(stu); 89 90 91 //db.SaveChanges(); //保存到数据库 92 #endregion 93 94 #region 删除的方法之二 95 //用过上下文对象的Entity方法,来把对象加入到EF中 96 DbEntityEntry entry = db.Entry<Student>(stu); 97 98 entry.State = EntityState.Deleted; 99 db.SaveChanges();//保存到数据库 100 101 #endregion 102 103 // return Redirect("/Student/Index"); 104 105 // return RedirectToAction("index"); //删除的时候,调用重定向方法,有一个缺点,就是不知道是删除成功还是失败 106 107 //删除的时候,我们还可以使用js代码,向用户返回删除成功还是失败 108 //window.location.href重新定向到新地址,不打开新窗口 109 Response.Write("<script>alert('删除成功~~~');window.location.href='/Student/Index';</script>"); 110 111 } 112 113 /// <summary> 114 /// 修改 115 /// </summary> 116 /// <param name="id"></param> 117 /// <returns></returns> 118 public ActionResult Modify(int id) 119 { 120 //根据ID查询Student表中的数据 121 Student stu = (from s in db.Student where s.s_ID == id select s).FirstOrDefault(); 122 123 124 //原始的方式,做下拉框 125 //查询班级集合数据,并做成下拉框 126 //List<Classes> listClass = db.Classes.ToList(); 127 //ViewBag.ListClassData = listClass; 128 129 130 //LINQ to Entities 不识别方法“System.String ToString()” 131 //List<SelectListItem> listClass = (from c in db.Classes 132 // select new SelectListItem() { Text = c.c_Name, Value = c.c_ID.ToString(), Selected = (stu.c_ID==c.c_ID) }).ToList(); 133 134 var listClass = db.Classes.ToList().Select(c => new SelectListItem() { Text = c.c_Name, Value = c.c_ID.ToString(), Selected = (stu.c_ID == c.c_ID) }); 135 136 //这里就有个疑问了,我们已经传了Student到View方法中,班级的数据该怎么传递到后台页面? 137 138 //PS:控制器上的Action方法,向视图传递数据,除了通过View()方法,将数据传递到视图中的Model属性之外, 139 //还有三种方式,Viewbag,ViewData,Tempdata 140 141 ViewBag.ListClassData = listClass; 142 143 return View(stu); //加载视图,并传递要修改的数据 144 } 145 146 [HttpPost] 147 public ActionResult Modify(Student model) 148 { 149 //将要修改的值,放到数据上下文中 150 DbEntityEntry entry= db.Entry<Student>(model); 151 entry.State = EntityState.Unchanged; 152 entry.Property("s_Name").IsModified = true; 153 entry.Property("c_ID").IsModified = true; 154 db.SaveChanges(); //将修改之后的值保存到数据库中 155 return Redirect("Index"); 156 } 157 158 /// <summary> 159 /// 添加 160 /// </summary> 161 /// <returns></returns> 162 public ActionResult Add() 163 { 164 var listClass = db.Classes.ToList().Select(c => new SelectListItem() {Text=c.c_Name,Value=c.c_ID.ToString(),Selected=true }); 165 166 ViewBag.ListClass = listClass; 167 return View(); 168 } 169 170 [HttpPost] 171 public ActionResult Add(Student entity) 172 { 173 DbEntityEntry entry= db.Entry<Student>(entity); 174 entry.State = EntityState.Added; 175 db.SaveChanges(); 176 return RedirectToAction("index"); 177 } 178 } 179 }
然后就是页面的代码了:
@model MVCFirstApp.Models.Student @{ Layout = null; } @using MVCFirstApp.Models; <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Add</title> </head> <body> <form action="~/Student/Add" method="post"> <input type="submit" value="添加" /> <table> <tr> <td>姓名:</td> <td>@Html.EditorFor(model=>model.s_Name)</td> </tr> <tr> <td>性别:</td> <td>男:@Html.RadioButtonFor(model=>model.s_Sex,"男")女:@Html.RadioButtonFor(model=>model.s_Sex,"女")</td> </tr> <tr> <td>年龄:</td> <td>@Html.EditorFor(model => model.s_Age)</td> </tr> <tr> <td>班级:</td> <td>@Html.DropDownList("C_ID", @ViewBag.ListClass as IEnumerable<SelectListItem>)</td> </tr> </table> </form> </body> </html>
@{ Layout = null; } @using MVCFirstApp.Models; <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> <link href="~/Scripts/My.css" rel="stylesheet" /> </head> <body> <table class="mytable"> <tr> <th>学号</th> <th>姓名</th> <th>性别</th> <th>年龄</th> <th>班级名</th> <th>操作</th> </tr> <!--视图里面包含一个Model属性,可以通过Action方法中的View方法来赋值--> @foreach (Student stu in Model) { <tr> <td>@stu.s_ID</td> <td>@stu.s_Name</td> <td>@stu.s_Sex</td> <td>@stu.s_Age</td> <td>@stu.Classes.c_Name</td> <!--传参数--> <td>@Html.ActionLink("修改", "Modify", new { id=@stu.s_ID})@Html.ActionLink("删除", "Delete", new { id=@stu.s_ID})@Html.ActionLink("增加", "Add")</td> </tr> } </table> </body> </html>
@model MVCFirstApp.Models.Student @*指定了model类型的视图就叫强类型视图, 好处:VS可以推断出model的类型,从而提供提示,model本来是动态的类型,使用的时候,一般都要转类型,使用as来转*@ @{ Layout = null; } @using MVCFirstApp.Models; <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Modify</title> </head> <body> <form method="post" action="/Student/Modify"> @*添加一个隐藏域*@ @*不添加隐藏域,点击修改的时候,ID的属性传不到Action方法*@ @*修改,必须要传主键过去,SID必须传,所以隐藏域不能少*@ <input type="hidden" name="s_ID" value="@Model.s_ID"><table> <tr> <td>姓名:</td> @*name属性的值,要和value里面绑定的属性名字一样,这样在修改的时候,才可以把参数传递到Action方法*@ <td><input type="text" name="s_Name" value="@Model.s_Name" /></td> @*文本框的name属性也使用和Model.s_Name一样,模型绑定*@ <td>班级:</td> @*班级要生成下拉框,要有班级数据*@ <td> @*dropDownlist第一个参数的字段,必须要和数据库中的字段一样,这里是将班级名称列出来,*@ @Html.DropDownList("c_ID", ViewBag.ListClassData as IEnumerable<SelectListItem>) @*ViewBag是动态的类型,使用的时候,需要转一下类型*@ @*下面这个是生成下拉框最原始的方式,有个不方便,就是要选中默认值*@ @*<select name="c_ID"> @foreach (Classes c in @ViewBag.ListClassData as List<Classes>) { //如果集合中的班级号,和Model里面的班级号相等,就在option标签,加上Selected if (c.c_ID == Model.c_ID) { <option value="@c.c_ID" selected>@c.c_Name</option> } else { <option value="@c.c_ID">@c.c_Name</option> } } </select>*@ </td> <td>性别:</td> @*name属性的值,要和value里面绑定的属性名字一样,这样在修改的时候,才可以把参数传递到Action Post方式的方法*@ <td><input type="text" name="s_Sex" value="@Model.s_Sex" /></td> <td>年龄:</td> <td><input type="text" name="s_Age" value="@Model.s_Age" /></td> <td><input type="submit" value="确定" /></td> </tr> </table> </form> </body> </html>
好了,就这么多了。
每天学一点,每天积累一天,进步就不止一点点!PS:好记性不如烂笔头,学会总结,学会思考~~~
----要飞翔,必须靠自己!