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>
修改页面
好了,就这么多了。
MVC增删查改,从数据库到后台,到前端,整个复习一下的更多相关文章
- MVC——再探MVC——增删查改
MVC 是我大学学的比较弱的,甚至不懂原理.(那时候都在准备蓝桥杯 软件杯比赛.) 在重新学 肯定要学MVC 现在知道了为什么叫MVC了 MVC是怎么工作的 MVC 是一个设计模式 控制器(Cont ...
- sql语法复习:增删查改,各种数据库对象创建和函数使用
推荐工具:机子配置较低的话,可以装Gsql这个工具获得sql执行环境(可作为手册查看内置数据类型 函数和存储过程等) --之前数据库的东西接触不多,虽然基本的语法是了解,但不是很熟悉--最近项目一直在 ...
- JDBC终章- 使用 DBUtils实现增删查改- C3P0Utils数据源/QueryRunner runner连接数据源并执行sql
JDBC终章- 使用 DBUtils实现增删查改 1.数据库结构 Create Table CREATE TABLE `user` ( `id` ) NOT NULL AUTO_INCREMENT, ...
- 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- 4.在MVC中使用仓储模式进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-using-the-repository-pattern-in-mvc/ 系列目录: ...
- 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- backbonejs mvc框架的增删查改实例
一:开发环境 coffeescript和nodejs需要先安装,没装网上自己查安装步骤. 代码编写环境及esp框架下载: esp框架下载地址:https://github.com/nonocast/e ...
- EasyUI的增删查改(后台ASP.NET)
转自:http://www.cnblogs.com/dedeyi/archive/2013/04/22/3035057.html 某某人曾经跟我说,你们做系统不就是增删查改吗. 是啊,很多时候我们就是 ...
- knockout+MVC+webapi+sqlserver完成增删查改
快过年了,公司的事情较少,想着开始学习点新东西.这段时间一个项目用到了mvc和webapi,然后一直对knockout比较感兴趣,就想着用这个框架做一个小实例.数据库采用的是sqlserver.话不多 ...
随机推荐
- 【C++沉思录】句柄2
1.[C++沉思录]句柄1 存在问题: 句柄为了绑定到Point的对象上,必须定义一个辅助类UPoint,如果要求句柄绑定到Point的子类上,那就存在问题了.2.有没有更简单的办法呢? 句柄使用Po ...
- 给VMware下的Linux扩展磁盘空间(以CentOS6.3为例)转
#查看挂载点:df -h#显示:文件系统 容量 已用 可用 已用%% 挂载点/dev/mapper/vg_dc01-lv_root 47G 12G 34G 25% /tmpfs 504M 88K 50 ...
- 阿里前DBA的故事
别人怎么享受生活,与你无关.你怎么磨砺与你有头.引用同事周黄江的一句话,很多人努力程度还远没有到拼天赋的时候. 成功的人都是那种目标很明确的人.对于文中厨师的经历很感兴趣.不管是IT还是餐饮,哪个行业 ...
- Windows 8.1 & Windows 10 取消 Windows Update 自动更新硬件驱动
最新文章:Virson's Blog 1.打开控制面板,在搜索框中搜索“设备”一次,检索出相关的设备设置功能,如下图: 2.在检索出的结果中点击“更改设备安装设置”,会弹出设备驱动的更新方式,按照如下 ...
- HTML5新特性之跨文档消息传输
1.同域限制 所谓“同域限制”是指,出于安全考虑,浏览器只允许脚本与同样协议.同样域名.同样端口的地址进行通信. 2.window.postMessage方法 浏览器限制不同窗口(包括iFrame窗口 ...
- 15款效果很酷的最新jQuery/CSS3特效
很久没来博客园发表文章了,今天就分享15款效果很酷的最新jQuery/CSS3特效,废话不说,一起来看看吧. 1.3D图片上下翻牌切换 一款基于jQuery+CSS3实现的3D图片上下翻牌切换效果,支 ...
- javascript方法 call()和apply()的用法
先上代码: apply()方法示例 /*定义一个人类*/ function Person(name,age) { this.name=name; this.age=age; } /*定义一个学生类*/ ...
- 常用SQL语句备忘录
1.---表中有重复记录用SQL语句查询出来 select * from Recharge where RechargeSerial in (select RechargeSerial from Re ...
- Java Web 工作技巧总结 16.8
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! 四时不谢之兰,百节长青之竹,万古不败之石,千秋不变之人. 1. AOP – LOG项目中,一个请 ...
- Appium环境抢建
原文:Appium环境抢建(for web browser test)Android SDKAppium安装 nodejs安装 Appium配置手机下载&运行测试项目Appium是Androi ...