你的位置:首页 > ASP.net教程

[ASP.net教程]MVC增删查改,从数据库到后台,到前端,整个复习一下


就当是记笔记吧,这里,就不讲什么版式了,首先上数据库脚本,这个是我这次练习用到的数据库脚本:

USE [DB_USERS]GO/****** Object: Table [dbo].[Student]  Script Date: 10/31/2015 16:44:06 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE 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]GOSET ANSI_PADDING OFFGOALTER 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 ONGOSET QUOTED_IDENTIFIER ONGOCREATE 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       #endregion102 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='http://www.cnblogs.com//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.Classes132       //        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,Tempdata140 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>

修改页面

好了,就这么多了。




普吉岛旅游去哪好普吉岛旅游团报价优惠普吉岛蜜月旅游行程参考普吉岛特价旅游多少钱到普吉岛游费用报价大全南澳七娘山野炊山庄团购?深圳七娘山野炊山庄优惠价? 七娘山野炊山庄学生票多少钱?深圳七娘山野炊山庄学生门票价格? 七娘山野炊山庄一日游?南澳七娘山野炊山庄怎么走? 中山五桂山逍遥谷电话?逍遥谷门票预订? 蓝田瑶族风情园门票预定?龙门蓝田瑶族风情园定票? 惠州蓝田瑶族风情园怎么样?蓝田瑶族风情园有什么好玩的? 蓝田瑶族风情园门票包含什么?龙门蓝田瑶族风情园有表演吗? 蓝田瑶族风情园团购价格?龙门蓝田瑶族风情园门票优惠政策? 平乐古镇在哪里_邛崃平乐古镇怎么走_成都到平乐古镇 万佛湖门票_安徽六安万佛湖门票价格_多少钱 深圳大梅沙门票_深圳大梅沙海滨公园门票_大梅沙门票价格多少钱 伏牛山在哪_伏牛山在哪里_伏牛山在哪个省 东大门市场 韩国商业街——COEX 韩国温泉 韩国购物之旅——釜山国际市场 IDT23S08E-2HDCGI Datasheet IDT23S08E-2HDCGI Datasheet ICS843004AGI-02LFT Datasheet ICS843004AGI-02LFT Datasheet IDT7202LA12P Datasheet IDT7202LA12P Datasheet 预定葡萄牙旅游 预定葡萄牙旅游 预定葡萄牙旅游 跟团去葡萄牙 跟团去葡萄牙 跟团去葡萄牙 葡萄牙旅游 旅行社 葡萄牙旅游 旅行社 葡萄牙旅游 旅行社