ASP.NET MVC Notes - 01
- 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(50)=null, @Gender char(1)=null, @City nvarchar(50)=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 > 0) { 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 > 0) { 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 = 0; if (ModelState.IsValid) { EmployeeService employeeService = new EmployeeService(); numSucc = employeeService.AddEmployee(employee); } if (numSucc > 0) { return RedirectToAction("Index"); } else { return View(); } }
-
- FormCollection 中包含了所有表单数据的键值对集合,通过FromCollection[Key] 访问到View Post 过来的 Data
- Service 新增数据服务:
-
public int AddEmployee(Employee employee) { int numSucc = 0; 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()); }
-