一.SQL数据库代码
CREATE DATABASE MVCLession31
GO
USE MVCLession31
GO
CREATE TABLE Dept (
DeptId int IDENTITY(1,1) PRIMARY KEY NOT NULL,
DeptName varchar(50) NOT NULL
);
GO
insert into Dept values('销售部'),('开发部'),('研发部')
CREATE TABLE Employee (
EmpId int IDENTITY(1,1) PRIMARY KEY NOT NULL,
DeptId int references Dept(DeptId) NOT NULL,
EmpName varchar(50) NOT NULL,
EmpPhone varchar(50) NOT NULL,
EmpArea varchar(50) NOT NULL,
EmpSalary decimal(18,2) NOT NULL
);
GO
insert into Employee values(1,'李四','15914541452','北京',12345),(2,'王麻子','15154541452','北京',22345),(3,'张三','15414541452','北京',52345)
go
CREATE TABLE UserInfo
(
UserId int IDENTITY(1,1) PRIMARY KEY NOT NULL,
UserName varchar(50) NOT NULL,
Password varchar(50) NOT NULL
)
go
insert into UserInfo values('123','123456'),('admin','1234567'),('admin2','11234567')
二.查询
1.查询页面
<body>
<center>
<h1>员工查询</h1>
<a href="AddEmpFrom">添加员工</a>
</center>
<div>
<table align="center" border="1" cellspacing="0" width="700">
<tr>
<th>员工编号</th>
<th>部门名称</th>
<th>员工姓名</th>
<th>员工电话</th>
<th>所在地区</th>
<th>员工薪资</th>
<th colspan="2">操作</th>
</tr>
@foreach (var item in ViewBag.info)
{
<tr>
<td>@item.EmpId</td>
<td>@item.DeptName</td>
<td>@item.EmpName</td>
<td>@item.EmpPhone</td>
<td>@item.EmpArea</td>
<td>@item.EmpSalary</td>
<td><a href="DeleteEmp?EmpId=@item.EmpId" onclick="return confirm('确定删除吗?') ">删除</a></td>
<td><a href="ExcistEmpFrom?EmpId=@item.EmpId">编辑</a></td>
</tr>
}
</table>
</div>
</body>
2.EmployeeViewFrom类
public class EmployeeViewFrom
{
public int EmpId { get; set; }
public string DeptName { get; set; }
public string EmpName { get; set; }
public string EmpPhone { get; set; }
public string EmpArea { get; set; }
public Nullable<decimal> EmpSalary { get; set; }
}
3.Home控制器中的Index方法
public ActionResult Index()
{
//ViewBag.info = db.Employee;
ViewBag.info = from e in db.Employee
join d in db.Dept on e.DeptId equals d.DeptId
select new EmployeeViewFrom
{
EmpId =e.EmpId,
EmpName =e.EmpName,
EmpPhone =e.EmpPhone,
EmpArea =e.EmpArea,
EmpSalary =e.EmpSalary,
DeptName =d.DeptName
};
return View();
}
4.运行结果
三.添加
1.添加页面
<body>
<center>
<h1>添加员工</h1>
</center>
<div>
<form action="AddEmp" method="post">
<table align="center" cellspacing="0" border="1" width="500">
<tr>
<th>所属部门:</th>
<td>
<select name="DeptId">
<option value="0">--请选择--</option>
@foreach (var imte in ViewBag.info)
{
<option value="@imte.DeptId">@imte.DeptName</option>
}
</select>
</td>
</tr>
<tr>
<th>员工姓名:</th>
<td>
<input type="text" name="EmpName" value="" />
</td>
</tr>
<tr>
<th>员工电话:</th>
<td>
<input type="text" name="EmpPhone" value="" />
</td>
</tr>
<tr>
<th>所在地区:</th>
<td>
<input type="text" name="EmpArea" value="" />
</td>
</tr>
<tr>
<th>员工薪资:</th>
<td>
<input type="text" name="EmpSalary" value="" />
</td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" name="name" value="添加员工" /></td>
</tr>
</table>
</form>
</div>
</body>
2.Home控制器中的AddEmp方法与AddEmpFrom方法
//添加员工页面显示
public ActionResult AddEmpFrom()
{
ViewBag.info = db.Dept;
return View();
}
//添加员工
public ActionResult AddEmp()
{
Employee emp = new Employee()
{
DeptId = int.Parse(Request["DeptId"]),
EmpName = Request["EmpName"],
EmpPhone = Request["EmpPhone"],
EmpArea = Request["EmpArea"],
EmpSalary =decimal.Parse(Request["EmpSalary"])
};
db.Employee.Add(emp);
int i = db.SaveChanges();
if (i>0)
{
return Content("<script>alert('添加成功');window.location.href='Index';</script>");
}
else
{
return Content("<script>alert('添加失败');window.location.href='AddEmpFrom';</script>");
}
}
3.运行结果
三.删除
1.Home控制器中的DeleteEmp方法
//删除员工
//简单写法以注释
public ActionResult DeleteEmp()
{
int empid = int.Parse(Request["EmpId"]);
//var emp = db.Employee.Find(empid);
//db.Employee.Remove(emp);
//int i = db.SaveChanges();
string sql = "delete from Employee where EmpId = @EmpId";
SqlParameter parameter = new SqlParameter("@EmpId", empid);
int i = db.Database.ExecuteSqlCommand(sql, parameter);
if (i > 0)
{
return Content("<script>alert('删除成功');window.location.href='Index';</script>");
}
else
{
return Content("<script>alert('删除失败');window.location.href='Index';</script>");
}
}
2.运行结果
四.修改
1.修改页面
<body>
<center>
<h1>编辑员工</h1>
</center>
<div>
<form action="ExcistEmp" method="post">
<input type="hidden" name="EmpId" value="@ViewBag.empinfo.EmpId" />
<table align="center" cellspacing="0" border="1" width="500">
<tr>
<th>所属部门:</th>
<td>
<select name="DeptId">
<option value="0">--请选择--</option>
@foreach (var item in ViewBag.info)
{
<option value="@item.DeptId">@item.DeptName</option>
}
</select>
</td>
</tr>
<tr>
<th>员工姓名:</th>
<td>
<input type="text" name="EmpName" value="@ViewBag.empinfo.EmpName" />
</td>
</tr>
<tr>
<th>员工电话:</th>
<td>
<input type="text" name="EmpPhone" value="@ViewBag.empinfo.EmpPhone" />
</td>
</tr>
<tr>
<th>所在地区:</th>
<td>
<input type="text" name="EmpArea" value="@ViewBag.empinfo.EmpArea" />
</td>
</tr>
<tr>
<th>员工薪资:</th>
<td>
<input type="text" name="EmpSalary" value="@ViewBag.empinfo.EmpSalary" />
</td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" name="name" value="修改员工" /></td>
</tr>
</table>
</form>
</div>
</body>
2.Home控制器中的ExcistEmpFrom方法和ExcistEmp
//编辑员工页面显示
public ActionResult ExcistEmpFrom()
{
int empid = int.Parse(Request["EmpId"]);
ViewBag.empinfo = db.Employee.Find(empid);
ViewBag.info = db.Dept;
return View();
}
//编辑员工
public ActionResult ExcistEmp()
{
int empid = int.Parse(Request["EmpId"]);
var emp = db.Employee.Find(empid);
emp.DeptId = int.Parse(Request["DeptId"]);
emp.EmpName = Request["EmpName"];
emp.EmpPhone = Request["EmpPhone"];
emp.EmpArea = Request["EmpArea"];
emp.EmpSalary = decimal.Parse(Request["EmpSalary"]);
int i = db.SaveChanges();
if (i > 0)
{
return Content("<script>alert('编辑成功');window.location.href='Index';</script>");
}
else
{
return Content("<script>alert('编辑失败');window.location.href='Index';</script>");
}
}
3.运行结果
五.登录
1.先在配置文件Web.config找到
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
</system.web>在里面写
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="3000"></forms>
</authentication>。配图如下:
2.在Controllers文件夹里建AccountController控制器
3.在所建项目中添加文件夹Filter,在文件夹Filter添加类MyExceptionFilter.cs里面后继承 HandleErrorAttribute类,重写HandleErrorAttribute类里的OnException方法
代码如下:
//引用using System.Web.Mvc;命名空间
//MyExceptionFilter类继承HandleErrorAttribute类
//重写HandleErrorAttribute类里的OnException方法
public class MyExceptionFilter : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
filterContext.Result = new RedirectResult("~/Account/LogOut");
filterContext.ExceptionHandled = true;
return;
}
}
4.HomeController控制器控制器下的Index页面是整个项目的首页,不需要登录就可以查看
代码如下:
<body>
<div>
首页
@Html.ActionLink("登录", "LogOn", "Account")
@Html.ActionLink("员工查询", "Index", "Account")
@Html.ActionLink("退出", "LogOut", "Account")
</div>
</body>
页面效果图
5.在AccountController控制器里面添加LogOn,LogOut页面 。AccountController控制器里面Index页面是登录之后才能看到的页面。三个页面代码如下:
(1)LogOn页面里需要引用语法@model (项目名称).Models.(数据库里的表名)
例:@model MVC登录.Models.UserInfo
@model MVC登录.Models.UserInfo
<body>
<div style="text-align:center">
@using (Html.BeginForm())
{
<table width="500" cellspacing="0" border="1" align="center">
<tr>
<td colspan="3" align="center">用户登录</td>
</tr>
<tr>
<td>用户名:</td>
<td>@Html.TextBoxFor(u => u.UserName)</td>
<td style="color:red">@Html.ValidationMessageFor(u => u.UserName)</td>
</tr>
<tr>
<td>密码:</td>
<td>@Html.PasswordFor(u => u.Password)</td>
<td style="color:red">@Html.ValidationMessageFor(u => u.Password)</td>
</tr>
<tr>
<td colspan="3" align="center"><input type="submit" value="登录" /></td>
</tr>
<tr>
<td colspan="3" style="color:red">
@Html.ValidationSummary(true)
</td>
</tr>
</table>
}
</div>
</body>
页面效果图
(2)LogOut页面
<body>
<div>
@Html.ActionLink("首页", "Index", "Home")
<div>
<img src="~/Img/2022-05-20_113017.png" width="100%" />
</div>
</div>
</body>
(3.Index页面
<div>
用户设置
@Html.ActionLink("主页","Index","Home")
</div>
6.在Models数据模型Model1.edmx下的Model1.tt里面找UserInfo.cs类,给属性添加验证
代码如下:
using System.ComponentModel.DataAnnotations;
public partial class UserInfo
{
public int UserId { get; set; }
[Required(ErrorMessage = "用户名不能为空")]
public string UserName { get; set; }
[Required(ErrorMessage = "密码不能为空")]
[DataType(DataType.Password)]
public string Password { get; set; }
}
7.在AccountController控制器里面添加LogOn,LogOut,Index方法
三个方法代码如下:
public class AccountController : Controller
{
// GET: Account
MVCLession31Entities db = new MVCLession31Entities();
//登录之后才能看到的页面
[Authorize]
public ActionResult Index()
{
//ViewBag.info = db.Employee;
ViewBag.info = from e in db.Employee
join d in db.Dept on e.DeptId equals d.DeptId
select new EmpViewForm
{
EmpId = e.EmpId,
DeptName = d.DeptName,
EmpName = e.EmpName,
EmpPhone =e.EmpPhone,
EmpArea = e.EmpArea,
EmpSalary =e.EmpSalary
};
return View();
}
//登录页面
public ActionResult LogOn()
{
return View();
}
//在post表单请求下执行的登录方法
[HttpPost]
public ActionResult LogOn(UserInfo u)
{
if (ModelState.IsValid && ValidateUser(u.UserName, u.Password))
{
//添加票证
FormsAuthentication.SetAuthCookie(u.UserName, false);
return RedirectToAction("Index");
}
ModelState.AddModelError("", "账号或者密码错误");
return View();
}
//与数据库连接的方法
private bool ValidateUser(string name, string pwd)
{
using (MVCLession31Entities db = new MVCLession31Entities())
{
var u = (from p in db.UserInfo where p.UserName == name && p.Password == pwd select p).FirstOrDefault();
if (u == null)
{
return false;
}
else
{
return true;
}
}
}
[MyExceptionFilter]
//退出页面
public ActionResult LogOut()
{
FormsAuthentication.SignOut();
return View();
}
8.运行视频
运行结果