#NET編程#
01第1節:項目搭建
一、項目要求
這裡我們使用微軟的.NET開發環境來搭建一個基於ASP.NET MVC 5為UI層的經典.NET三層架構來開發一個增、刪、改、查的基本操作功能系統。
.NET開發環境配置如下:
經典.NET三層架構。ASP.NET MVC 5為UI層。SQL Server 2019資料庫。ADO.NET為數據通信組件。本系統的核心功能主要有:
實現ViewModel到DataModel的轉換。ADO.NET數據對象到泛型集合List<T>的轉換。完成添加數據功能。完成刪除數據功能。完成編輯數據功能。完成各種查詢數據。二、項目結構
這裡採用經典.NET三層架構來實現系統的開發,三層如下說明:
數據訪問層:主要通過數據模型與資料庫交互,獲取資料庫中的數據和向資料庫添加數據。通過DBHelper.cs類庫使用SQL語句操作資料庫,數據訪問層使用DAL表示。業務邏輯層:主要用於處理複雜的業務邏輯,不能與資料庫打交道,該是表現層與數據訪問的中間層。不管是向資料庫保存數據還是返回資料庫中的數據,都必須經過業務邏輯層的處理。業務邏輯層使用BLL表示。表現層:該層主要與用戶直接打交道,是最終呈現給用戶的界面,如註冊頁面、登錄頁面等都屬於表現層。其實業務邏輯層和數據訪問層都是為表現層忙活的,表現層是最終的結果。表現層使用UI表示。
根據經典.NET三層的功能和作用,使用Visual Studio 2019 IDE開發工具搭建該項目的結果,UI層採用ASP.NET MVC 5應用程式,BLL和DAL採用C#類庫,增加了數據模型層,用於各層之間通信。
VS2019的解決方案中可以存放多個項目,每個項目根據框架的需要而創建,對於類庫來說,主要是一些C#代碼,最終提供給UI層調用和使用。
三層創建完成之後,還需要添加引用,引用關係如下:
DAL層引用Models層。BLL層引用DAL層和Models層。UI層引用BLL層和Models層。
02第2節:資料庫設計
這裡主要講解如何將ASP.NET MVC 5融入到經典.NET三層架構中實現基本的增刪改查操作,這是所有軟體系統的核心基礎功能,因此,這裡以一個表為例子,把三層和MVC5徹底講解清楚。
這裡以學生(Student)表為例,表結構如下:
在此表結構中,創建了8個欄位,其中Id是GUID類型,為主鍵。有了表結構,我們就可以通過.NET MVC 5應用程式向表中添加數據和獲取數據了。
03第3節:數據模型
這裡我們將數據模型(主要與資料庫交互)與視圖模型(主要與視圖交互)分開,一開始就養成這種分離的習慣,在日後的大型項目開發中,能更靈活的控制視圖中的數據與數據模型中的數據交互。
學生數據模型StudentDataModel完整原始碼如下:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Yidosoft.Edu.Models{/// <summary>/// 實體模型/// </summary>public class StudentDataModel{/// <summary>/// 唯一標識/// </summary>public Guid Id { get; set; }/// <summary>/// 姓名/// </summary>public string Name { get; set; }/// <summary>/// 郵箱/// </summary>public string Email { get; set; }/// <summary>/// 年齡/// </summary>public int Age { get; set; }/// <summary>/// 手機號碼/// </summary>public string PhoneNumber { get; set; }/// <summary>/// 密碼/// </summary>public string Pwd { get; set; }/// <summary>/// 創建時間/// </summary>public DateTime CreateTime { get; set; }/// <summary>/// 性別/// </summary>public bool Sex { get; set; }}}
StudentDataModel類中的屬性名稱和數據類型都是與SQL Server資料庫中MvcStudent表中的欄位一一對應的。
04第4節:視圖模型
ASP.NET MVC 5中,視圖模型主要在視圖中使用,具有模型驗證功能。視圖模型放在MVC項目UI層的Models文件夾下。視圖模型中的數據也是來自數據模型,只不過,視圖模型中的數據是根據視圖需要而組建的,視圖模型中的數據可能是來自一張表,也可能是來自多張表。且還可以在視圖模型中做一些簡單的數據轉換。
UI層的StudentViewModel視圖模型完整C#原始碼如下:
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.ComponentModel.DataAnnotations;namespace Yidosoft.Edu.Mvc5.Models{public class StudentViewModel{[Display(Name="姓名")][Required(ErrorMessage="請輸入{0}。")]public string Name { get; set; }[Display(Name="郵箱")][Required][EmailAddress(ErrorMessage="{0}格式不正確。")]public string Email { get; set; }[Display(Name="年齡")][Required][Range(1,150)]public int Age { get; set; }[Display(Name="手機號")][Required][RegularExpression("^1[0-9]{10}$")]public string PhoneNumber { get; set; }[Display(Name="密碼")][Required][StringLength(8,MinimumLength=2)]public string Pwd { get; set; }[Display(Name="確認密碼")][Required][StringLength(8,MinimumLength=2)][Compare("Pwd")]public string ConfirmPwd { get; set; }[Display(Name="性別")][Required]public string Sex { get; set; }public Guid Id { get; set; }}}
這裡使用了System.ComponentModel.DataAnnotations命名空間,可以在屬性上添加模型驗證特性,如必填、限制字符串長度、手機號驗證等。這樣做的好處是,無需我們再編寫JavaScript代碼實現客戶端驗證,模型驗證幫我們實現了雙重驗證。
05第5節:功能開發
一、顯示數據功能
這裡使用的控制器是StudentController,所有關於學生相關的操作都放在該控制器中。一般情況下,一個控制器對應於一個表的操作,如CRUD操作都是在同一個控制器中操作的。並且還會對應訪問的URL地址,這樣不管是開發者,還是訪問者,都很清析明了。
在UI層的「Controllers」文件夾中添加StudentController控制器,並編寫如下C#代碼:
/// <summary>/// 顯示數據/// </summary>/// <returns></returns>public ActionResult List(){List<StudentViewModel> studentList = new List<StudentViewModel>();SqlDataReader sdr = sBLL.GetAllData();while(sdr.Read()){StudentViewModel vModel = new StudentViewModel();vModel.Id = sdr.GetGuid(0);vModel.Name = sdr.GetString(1);vModel.Email = sdr.GetString(2);vModel.Age = sdr.GetInt32(3);vModel.PhoneNumber = sdr.GetString(4);vModel.Pwd = sdr.GetString(5);object sex = sdr["Sex"];if(sex.ToString()!=""){vModel.Sex = sdr.GetBoolean(7) == true ? "男" : "女";}studentList.Add(vModel);}return View(studentList);}
這裡使用了已封裝好的DBHelper類庫操作資料庫,且將數據模型轉換為視圖模型,也可以將DataTable轉換為可枚舉的類型。然後使用Linq查詢並返回可以在視圖中遍歷的數據類型。
DataTable dt = sBLL.GetAllDataInfo();var xDT = from d in dt.AsEnumerable()select new StudentViewModel{Name = d.Field<string>("Name"),Email = d.Field<string>("Email")};return View(xDT);
使用IEnumerable類型方便查詢,並且還可以將ADO.NET中的數據進行處理後再顯示到頁面上。
@model IEnumerable<Yidosoft.Edu.Mvc5.Models.StudentViewModel><div><table><tr style="background-color:#808080;color:#fff;"><td>姓名</td><td>性別</td><td>郵箱</td><td>操作</td></tr>@foreach (var v in Model){<tr><td>@v.Name</td><td>@v.Sex</td><td>@v.Email</td><td><a href="javascript:del('@v.Id')">刪除</a><input type="button" value="刪除" onclick="javascript: del('@v.Id')" /></td></tr>}</table></div>
當資料庫中的數據通過ADO.NET技術傳遞給視圖模型之後,視圖模型作為對象傳遞給視圖,那麼在視圖中就可以輕鬆的使用@model獲取數據並顯示在頁面上。
二、添加數據功能
對於在ASP.NET MVC 5中實現添加數據的功能,需要兩個相同的操作方法在控制器中,一個是用於GET請求的獲取數據,一個是用於POST請求的提交數據。
由於我們首先需要打開填寫數據的頁面,先填寫表單數據,此時就要使用GET請求。當填寫完數據提交時,就需要POST請求。
Add()操作方法的C#完整代碼如下:
/// <summary>/// 顯示添加頁面/// </summary>/// <returns></returns>public ActionResult Add(){return View();}/// <summary>/// 提交表單數據/// </summary>/// <param name="viewModel"></param>/// <returns></returns>[HttpPost]public ActionResult Add(StudentViewModel viewModel){StudentDataModel dModel = new StudentDataModel();dModel.Id = Guid.NewGuid();dModel.Name = viewModel.Name;dModel.Email = viewModel.Email;dModel.PhoneNumber = viewModel.PhoneNumber;dModel.Pwd = viewModel.Pwd;dModel.Sex = viewModel.Sex == "男" ? true : false;dModel.CreateTime = DateTime.Now;dModel.Age = viewModel.Age;int r = sBLL.CreateData(dModel);ViewBag.r = r;return View();}
在Views文件夾下添加對應的視圖,並編寫如下代碼:
@{Layout = null;}@model Yidosoft.Edu.Mvc5.Models.StudentViewModel<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width" /><title>添加學生基本信息</title><script src="~/Scripts/jquery-1.10.2.js"></script><script src="~/Scripts/jquery.validate.js"></script><script src="~/Scripts/jquery.validate.unobtrusive.js"></script><link href="~/Content/bootstrap.css" rel="stylesheet" /><link href="~/Content/Site.css" rel="stylesheet" /></head><body><div>@using (Html.BeginForm("Add", "Student", FormMethod.Post)){<table><tr><td>姓名</td><td>@Html.TextBoxFor(m => m.Name)</td><td>@Html.ValidationMessageFor(m => m.Name)</td></tr><tr><td>郵箱</td><td>@Html.TextBoxFor(m => m.Email)</td><td>@Html.ValidationMessageFor(m => m.Email)</td></tr><tr><td>年齡</td><td>@Html.TextBoxFor(m => m.Age)</td><td>@Html.ValidationMessageFor(m => m.Age)</td></tr><tr><td>手機號</td><td>@Html.TextBoxFor(m => m.PhoneNumber)</td><td>@Html.ValidationMessageFor(m => m.PhoneNumber)</td></tr><tr><td>@Html.LabelFor(m => m.Pwd)</td><td>@Html.PasswordFor(m => m.Pwd)</td><td>@Html.ValidationMessageFor(m => m.Pwd)</td></tr><tr><td>@Html.LabelFor(m => m.ConfirmPwd)</td><td>@Html.Password("ConfirmPwd")</td><td>@Html.ValidationMessageFor(m => m.ConfirmPwd)</td></tr><tr><td>@Html.LabelFor(m => m.Sex)</td><td>@Html.RadioButtonFor(m => m.Sex, "男") 男@Html.RadioButtonFor(m => m.Sex, "女", new { @checked = "checked" }) 女</td><td></td></tr><tr><td> </td><td><input type="submit" value="提交" /> </td><td> </td></tr></table>}</div></body></html>
對於添加數據的視圖,這裡全部使用了Html輔助方法,且與視圖模型融合在一起對數據進行添加。
三、刪除數據功能
對於ASP.NET MVC5實現的刪除數據功能,我們只需要在控制器中使用一個刪除的方法即可,刪除成功後再轉到顯示數據的頁面上去,這樣顯示頁面上會重新獲取數據,刪除後的數據將不顯示。
@{Layout = null;}@model IEnumerable<Yidosoft.Edu.Mvc5.Models.StudentViewModel><!DOCTYPE html><html><head><meta name="viewport" content="width=device-width" /><title></title><link href="~/Content/bootstrap.css" rel="stylesheet" /><script src="~/Scripts/jquery-1.10.2.js"></script><script type="text/javascript">function del(obj) {var b = confirm("是否刪除?" + obj);if(b){location.href = "/Student/Del/"+obj;}}</script></head><body><div><table><tr style="background-color:#808080;color:#fff;"><td>姓名</td><td>性別</td><td>郵箱</td><td>操作</td></tr>@foreach (var v in Model){<tr><td>@v.Name</td><td>@v.Sex</td><td>@v.Email</td><td><a href="javascript:del('@v.Id')">刪除</a><input type="button" value="刪除" onclick="javascript: del('@v.Id')" /></td></tr>}</table></div></body></html>
刪除時,只需要傳入Id即可,在SQL Server資料庫中,根據主鍵ID就可以刪除行數據。控制器中刪除操作方法的C#代碼如下:
/// <summary>/// 刪除數據/// </summary>/// <param name="id"></param>public ActionResult Del(string id){RedirectToRouteResult vR = null;if (!string.IsNullOrWhiteSpace(id)){int row = sBLL.DelData(id);if (row >= 1){vR= RedirectToAction("List");}else{vR = RedirectToAction("Error");}}return vR;}
這裡只是將在ASP.NET MVC 5框架中,對於軟體系統的顯示數據、添加數據和刪除數據功能,提供了核心代碼,這些核心代碼可以拿來直接在項目中使用。
通過上面的學習,我們知道通過三層如何與MVC 5框架對接,並填充視圖模型,通過強類型視圖將數據呈現給表現層,能夠清楚的知道MVC 5是如何工作的,為將來開發更大的系統做好準備。