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.话不多 ...
随机推荐
- Pinterest 架构:两年内月 PV 从零到百亿【翻译】
原文地址 这篇文章,采用 Markdown 方式,写的还是比较实在的,要是有架构图就好了. Pinterest 是图片版的 Twitter,用户把自己感兴趣的东西用图钉(Pins)钉在钉板(PinBo ...
- 高大上技术之sql解析
Question: 为何sql解析和高大上有关系?Answer:因为数据库永远都是系统的核心,CRUD如此深入码农的内心...如果能把CRUD改造成高大上技术,如此不是造福嘛... CRUD就是Cre ...
- 今日 使用ajaxfileupload 异步上传 但是在IE下面 会弹出下载框
本来以为ajaxfileupload.js的问题 后来发现 其实是 后台代码返回来的时候 修改context.Response.ContentType = "text/html"; ...
- Android Dagger依赖注入框架浅析
今天接触了Dagger这套android的依赖注入框架(DI框架).感觉跟Spring 的IOC差点儿相同吧.这个框架它的优点是它没有採用反射技术(Spring是用反射的),而是用预编译技术.因为基于 ...
- hadoop错误之ClassNotFoundException
http://www.cnblogs.com/kaizhangzhang/p/3495438.html 在win7下运行hadoop-1.1.2 worldcount代码的时候出现下面的错误,折腾了差 ...
- ECSHOP后台SQL查询提示错误 this sql May contain UPDATE,DELETE,TRUNCATE,ALTER,DROP,FLUSH,INSERT
一).首先说一下错误现象:市面上流行的绝大部分ECSHOP模板,安装的时候都需要执行一段或几段SQL语句来修改数据结构或者初始化一些数据.大多数ECSHOP管理员为了省事,都会通过 “ECSHOP后台 ...
- T-SQL 公用表表达式(CTE)
公用表表达式(CTE) 在编写T-SQL代码时,往往需要临时存储某些结果集.前面我们已经广泛使用和介绍了两种临时存储结果集的方法:临时表和表变量.除此之外,还可以使用公用表表达式的方法.公用表表达式( ...
- javascript方法 call()和apply()的用法
先上代码: apply()方法示例 /*定义一个人类*/ function Person(name,age) { this.name=name; this.age=age; } /*定义一个学生类*/ ...
- List的遍历和删除元素
package test; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public c ...
- [LeetCode] Additive Number
Af first I read the title as "Addictive Number". Anyway, this problem can be solved elegan ...