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(,) NOT NULL,
[s_Name] [NVARCHAR]() NULL,
[s_Sex] [CHAR]() 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]() 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

下面就是后台的代码了:

 using MVCFirstApp.Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace MVCFirstApp.Controllers
{
public class StudentController : Controller
{ public StudentController() {
//关闭实体验证
db.Configuration.ValidateOnSaveEnabled = false;
}
DB_USERSEntities db = new DB_USERSEntities();
//
// GET: /Student/ public ActionResult Index()
{ List<Student> list = db.Student.Include("Classes").ToList(); return View(list); //将list对象传给视图里的Model属性
} /// <summary>
///
/// </summary>
/// <returns></returns>
//public ActionResult Delete(int id) //这里的id要和路由里面的id参数一样,不区分大小写
//{ // Student stu = new Student() { s_ID = id }; // #region 删除的方法之一
// //删除的方法之一
// //加入到数据上下文中
// //使用Remove方法删除。必须先Attach // //db.Student.Attach(stu);
// //db.Student.Remove(stu); // //db.SaveChanges(); //保存到数据库
// #endregion // #region 删除的方法之二
// //用过上下文对象的Entity方法,来把对象加入到EF中
// DbEntityEntry entry = db.Entry<Student>(stu); // entry.State = EntityState.Deleted;
// db.SaveChanges();//保存到数据库 // #endregion // // return Redirect("/Student/Index"); // return RedirectToAction("index"); //删除的时候,调用重定向方法,有一个缺点,就是不知道是删除成功还是失败 // //删除的时候,我们还可以使用js代码,向用户返回删除成功还是失败
// //Response.Write("<script></script>"); //} /// <summary>
/// 删除
/// </summary>
/// <param name="id"></param>
public void Delete(int id) //这里的id参数必须要和路由里面的id参数一样,才可以,将参数id传到控制器方法,不过不区分大小写,即写ID也行
{ Student stu = new Student() { s_ID = id }; #region 删除的方法之一
//删除的方法之一
//加入到数据上下文中
//使用Remove方法删除。必须先Attach //db.Student.Attach(stu);
//db.Student.Remove(stu); //db.SaveChanges(); //保存到数据库
#endregion #region 删除的方法之二
//用过上下文对象的Entity方法,来把对象加入到EF中
DbEntityEntry entry = db.Entry<Student>(stu); entry.State = EntityState.Deleted;
db.SaveChanges();//保存到数据库 #endregion // return Redirect("/Student/Index"); // return RedirectToAction("index"); //删除的时候,调用重定向方法,有一个缺点,就是不知道是删除成功还是失败 //删除的时候,我们还可以使用js代码,向用户返回删除成功还是失败
//window.location.href重新定向到新地址,不打开新窗口
Response.Write("<script>alert('删除成功~~~');window.location.href='/Student/Index';</script>"); } /// <summary>
/// 修改
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public ActionResult Modify(int id)
{
//根据ID查询Student表中的数据
Student stu = (from s in db.Student where s.s_ID == id select s).FirstOrDefault(); //原始的方式,做下拉框
//查询班级集合数据,并做成下拉框
//List<Classes> listClass = db.Classes.ToList();
//ViewBag.ListClassData = listClass; //LINQ to Entities 不识别方法“System.String ToString()”
//List<SelectListItem> listClass = (from c in db.Classes
// select new SelectListItem() { Text = c.c_Name, Value = c.c_ID.ToString(), Selected = (stu.c_ID==c.c_ID) }).ToList(); 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) }); //这里就有个疑问了,我们已经传了Student到View方法中,班级的数据该怎么传递到后台页面? //PS:控制器上的Action方法,向视图传递数据,除了通过View()方法,将数据传递到视图中的Model属性之外,
//还有三种方式,Viewbag,ViewData,Tempdata ViewBag.ListClassData = listClass; return View(stu); //加载视图,并传递要修改的数据
} [HttpPost]
public ActionResult Modify(Student model)
{
//将要修改的值,放到数据上下文中
DbEntityEntry entry= db.Entry<Student>(model);
entry.State = EntityState.Unchanged;
entry.Property("s_Name").IsModified = true;
entry.Property("c_ID").IsModified = true;
db.SaveChanges(); //将修改之后的值保存到数据库中
return Redirect("Index");
} /// <summary>
/// 添加
/// </summary>
/// <returns></returns>
public ActionResult Add()
{
var listClass = db.Classes.ToList().Select(c => new SelectListItem() {Text=c.c_Name,Value=c.c_ID.ToString(),Selected=true }); ViewBag.ListClass = listClass;
return View();
} [HttpPost]
public ActionResult Add(Student entity)
{
DbEntityEntry entry= db.Entry<Student>(entity);
entry.State = EntityState.Added;
db.SaveChanges();
return RedirectToAction("index");
}
}
}

后台代码

然后就是页面的代码了:

@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>

修改页面

好了,就这么多了。

上一篇:web.config中的connectionString里面应该怎么写?


下一篇:(大数据工程师学习路径)第二步 Vim编辑器----查找替换