- inetmgr 进入IIS
- ViewBag和ViewData在run-time的时候检查错误,View中的用法如下:
@*ViewBag传递的是动态对象*@
@foreach (string item in ViewBag.listData)
{
<li>@item</li>
}
-----------------------------------------
@*ViewData传递的是Object,所以要转换类型*@
@foreach (string item in (List<string>)ViewData["Countries"])
{
<li>@item</li>
}- web.config中连接字符串名称需要和DbContext的类名称一致:
public class EmployeeContext : DbContext
{
//定义对应到数据库表的对象集合
public DbSet<Employee> Employees { get; set; }
} <add name="EmployeeContext"
providerName="System.Data.SqlClient"
connectionString="Data Source=.;Initial Catalog=MVCSample;User ID= ;Password= ; " />- Global.ashx 程序运行初始化配置:
//DBFirst从数据读取数据,程序运行的时候EmployeeContext初始化为Null
Database.SetInitializer<MVCBlog.Models.EmployeeContext>(null);- View需要List数组对象,则强类型直接定义为IEnumerable; View中@using引用需要用到的类
@model IEnumerable<MVCBlog.Models.Employee>
@using MVCBlog.Models @{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
} <h2>Index</h2> @*Controller 传递过来的是List对象,所以强类型定义为List<MVCBlog.Models.Employee>*@
<ul>
@foreach (Employee employee in @Model)
{
<li> @Html.ActionLink(employee.Name, "Details", new { @id = @employee.EmployeeID }) </li>
}
</ul>- 业务逻辑层获取数据
public IEnumerable<Employee> employees
{
get
{
string connectionString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString; List<Employee> employees = new List<Employee>(); using (SqlConnection con = new SqlConnection(connectionString))
{ SqlCommand cmd = new SqlCommand("sp_GetAllEmployee", con);
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
SqlDataReader sdr = cmd.ExecuteReader();
while (sdr.Read())
{
Employee employee = new Employee();
employee.EmployeeID = Convert.ToInt32(sdr["EmployeeID"]);
employee.Name = sdr["Name"].ToString();
employee.City = sdr["City"].ToString();
employee.Gender = Convert.ToChar(sdr["Gender"]); employees.Add(employee);
}
return employees;
}
}
}- Razor中构建DropList:
@Html.DropDownList("Gender", new List<SelectListItem> {
new SelectListItem { Text="男",Value="M"},
new SelectListItem{ Text="女",Value="F"}
}, "Select Gender", htmlAttributes: new { @class = "control-label col-md-2" })
//或者是在Controller中构建SelectList后,Razor中Render
ViewBag.DepartID = new SelectList(db.Department, "ID", "Name", employee.DepartID); @Html.DropDownList("DepartID", null, "Select Department",htmlAttributes: new { @class = "form-control" })- Procedure AddEmployee
CREATE PROCEDURE sp_AddEmployee
@Name nvarchar()=null,
@Gender char()=null,
@City nvarchar()=null,
@DateOfBirth DateTime=null
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
Insert Into Employee(Name,Gender,City,DateOfBirth)
values(@Name,@Gender,@City,@DateOfBirth)
END
GO- Controller搜集从View页面Post过来的数据,有三种方法:
- FormCollection 中包含了所有表单数据的键值对集合,通过FromCollection[Key] 访问到View Post 过来的 Data
[HttpPost]
public ActionResult Create(FormCollection formCollection)
{
//foreach (string key in formCollection.AllKeys)
//{
// Response.Write(key + " ");
// Response.Write(formCollection[key] + "<br/>");
//} Employee employee = new Employee();
employee.Name = formCollection["Name"];
employee.Gender = Convert.ToChar(formCollection["Gender"]);
employee.City = formCollection["City"];
employee.DateOfBirth = Convert.ToDateTime(formCollection["DateOfBirth"]); EmployeeService employeeService = new EmployeeService();
int numSucc = employeeService.AddEmployee(employee); if (numSucc > )
{
return RedirectToAction("Index");
}
else
{
return View();
}
}
- 直接以参数的形式接收数据
[HttpPost]
public ActionResult Create(string Name,char Gender,string City,string DateOfBirth)
{
Employee employee = new Employee();
employee.Name = Name;
employee.Gender = Gender;
employee.City = City;
employee.DateOfBirth = Convert.ToDateTime(DateOfBirth); EmployeeService employeeService = new EmployeeService();
int numSucc = employeeService.AddEmployee(employee); if (numSucc > )
{
return RedirectToAction("Index");
}
else
{
return View();
}
}
- Controller中UpdaetModel 更新 Model,获得提交过来的数据
[HttpPost]
[ActionName("Create")]
public ActionResult Create_Post()
{
Employee employee = new Employee();
UpdateModel<Employee>(employee); int numSucc = ;
if (ModelState.IsValid)
{
EmployeeService employeeService = new EmployeeService();
numSucc = employeeService.AddEmployee(employee);
} if (numSucc > )
{
return RedirectToAction("Index");
}
else
{
return View();
}
}
- FormCollection 中包含了所有表单数据的键值对集合,通过FromCollection[Key] 访问到View Post 过来的 Data
- Service 新增数据服务:
public int AddEmployee(Employee employee)
{
int numSucc = ;
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand("sp_AddEmployee", conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter[] paras = new SqlParameter[] {
new SqlParameter("Name",employee.Name),
new SqlParameter("Gender",employee.Gender),
new SqlParameter("City",employee.City),
new SqlParameter("DateOfBirth",employee.DateOfBirth)
};
cmd.Parameters.AddRange(paras); conn.Open();
numSucc = cmd.ExecuteNonQuery();
} return numSucc;
}
- 解决方案中的Nuget包管理器对解决方案中的Nuget包进行管理。
-
Controller中模型绑定的两种方法:
1,Bind 制定需要进行模型绑定传递到Controller中的数据。public ActionResult Edit_Post([Bind(Include = "Gender , City,DateOfBirth")]Employee employee)
2,在UpdateModel中,传递需要更新或者是不需要更新的参数
UpdateModel<Employee>(employee, null, null, new string[] { "Name" });
3,定义IEmployee接口,Employee继承自IEmployee.
UpdateModel<IEmployee>(employee);
- 进行数据的Delete动作必须在Post数据中执行
@foreach (var item in Model)
{
using (Html.BeginForm("Delete", "Employee", new { id = item.ID }))
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Gender)
</td>
<td>
@Html.DisplayFor(modelItem => item.City)
</td>
<td>
@Html.DisplayFor(modelItem => item.DateOfBirth)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.ID }) |
@Html.ActionLink("Details", "Details", new { id = item.ID }) |
<input type="submit" value="Delete" onclick="return confirm('确定删除 @item.Name 吗 ')" />
</td>
</tr>
}
}
- EF中字段属性的控制,如:[Required]、[Display(Name="")] 需在partial class中进行处理
[MetadataType(typeof(EmployeeMetaData))]
public partial class Employee
{ }
public class EmployeeMetaData
{
[Required]
[Display(Name = "姓名")]
public string Name { get; set; } [Required]
[Display(Name = "性别")]
public char Gender { get; set; } [Required]
[Display(Name = "所在城市")]
public string City { get; set; } [Required]
[Display(Name = "生日")]
public DateTime DateOfBirth { get; set; } [Required]
[Display(Name = "部门")]
public int DepartID { get; set; }
}
- Edit信息的时候不需要更新字段的处理,如不需要更新Name。
- partial class 中 去掉 [Required]
- Edit方法中用 查出来的实体来存储更新后的数据
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "ID,Gender,City,DateOfBirth,DepartID")] Employee employee)
{
Employee employeeFromDB = db.Employee.Find(employee.ID); //须要用你查出来的实体来存储更新后的数据,不更新Name字段
employeeFromDB.City = employee.City;
employeeFromDB.Gender = employee.Gender;
employeeFromDB.DepartID = employee.DepartID;
employeeFromDB.DateOfBirth = employee.DateOfBirth; if (ModelState.IsValid)
{
db.Entry(employeeFromDB).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.DepartID = new SelectList(db.Department, "ID", "Name", employee.DepartID);
return View(employee);
}- Controller的Create方法中必需的字段,添加验证检查处理
if (string.IsNullOrEmpty(employee.Name))
{
ModelState.AddModelError("Name", "姓名为必需字段");
}
- Lambda表达式,统计Department下Employee数量
[HttpGet]
public ActionResult EmployeeByDepartment()
{
var departmentTotals = db.Employee.Include("Department")
.GroupBy(d => d.Department.Name)
.Select(y => new DepartmentTotals
{
Name = y.Key,
Total = y.Count()
}).ToList().OrderByDescending(y => y.Total); return View(departmentTotals);
}
- Controller中Return View()中如果指定带有后缀的View,如index.cshtml,则需要传递完整路径:
public ActionResult Index()
{
var employee = db.Employee.Include(e => e.Department);
return View("~/Views/Employee/Index.cshtml",employee.ToList());
}