每天学一点,每天积累一点,进步就不止一点点!PS:好记性不如烂笔头,学会总结,学会思考~~~ ----要飞翔,必须靠自己!

灰太狼的梦想

好记性不如烂笔头,学会总结,学会思考~~~

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>
修改页面

好了,就这么多了。

posted @ 2015-10-31 19:33  灰太狼的梦想  阅读(5699)  评论(1编辑  收藏  举报