01第1節:視圖模型
一、概述:
在ASP.NET MVC 5中,MVC中的M指的是視圖模型,此模型對象只是給View視圖使用的模型,與經典三層架構中的數據模型是不同的,數據模型是與DAL(數據訪問層)打交道的。二者不要混淆了。
MVC 5框架用來擔當經典三層架構中的UI層。ASP.NET MVC 5與ASP.NET WebForm框架都是用來擔當UI層的,都是微軟為Web應用程式開發推出的一套UI框架。
二、創建視圖模型類:
在使用Visual Studio 2019開發的ASP.NET MVC 5項目的「Models」文件夾中創建的Model是ViewModel,也就是視圖模型,是供Razor視圖使用的。因此在以後的創建視圖模型時,建議都要以「ViewModel.cs」結尾,如「StudentViewModel.cs 」表示學生視圖模型,微軟的例子中,視圖模型也是以「ViewModel」為後綴的。
ASP.NET MVC 5中的視圖模型類就是一個普通的類,使用時在其中編寫屬性即可。這些屬性是可以添加數據註解和模型驗證的,使用System.ComponentModel.DataAnnotations命名空間下的驗證,可以實現無需編寫JS代碼,就可以實現客戶端的驗證。
下面重點講解給屬性添加的各種註解和驗證,這些都是微軟在.NET類庫中幫我們已經編寫好的,需要時添加到屬性上即可。
02第2節:數據註解和模型驗證
由於視圖模型是供視圖使用的,那麼還可以進行一些數據驗證,能夠驗證的這些屬性稱為模型驗證。
完整的StudentViewModel視圖模型C#代碼如下:
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.ComponentModel.DataAnnotations;namespace Yido.Edu.Models{public class StudentViewModel{[Display(Name = "Id")][Required(ErrorMessage="Id不可為空")]public Guid Id { get; set; }[Display(Name="姓名")][Required(ErrorMessage="姓名不能為空")][StringLength(6,ErrorMessage="最大長度為6個")]public string Name { get; set; }[Display(Name="郵箱地址")][Required(ErrorMessage="郵箱不可為空")][StringLength(255,ErrorMessage="最大為{0}個字符")][EmailAddress(ErrorMessage="郵箱地址格式不正確")]public string Email { get; set; }[Display(Name="年齡")][Required][Range(1,150)]public int Age { get; set; }[Display(Name="手機號碼")][Required()][RegularExpression("^1{1}[0-9]{10}$",ErrorMessage="手機號不正確")]public string PhoneNumber { get; set; }[Display(Name="密碼")][Required][StringLength(8)]public string Pwd { get; set; }[Display(Name="確認密碼")][Required][StringLength(8)][Compare("Pwd",ErrorMessage="密碼不一致")]public string ConfrimPwd { get; set; }}}
從此模型代碼中看,與三層架構中的數據實體模型是不一樣的,在數據實體Model中是不能使用數據註解驗證特性的。
一、Display特性:
使用Display特性可為模型對象中的屬性設置顯示名稱。
[Display(Name="姓名")]public string Name { get; set; }
這樣,當我們在視圖中使用Name屬性時,就可以將Name屬性使用中文的「姓名」來顯示。
二、Required特性:
Required特性用於指定屬性的必需項驗證,對於模型驗證特性,則其中的指定的錯誤信息,需要在提交的方法中使用ModelState.IsValid來判斷,從而才能輸出錯誤信息。
[Display(Name="姓名")][Required(ErrorMessage="姓名不能為空")]public string Name { get; set; }
三、StringLength特性:
使用StringLength特性可以指定屬性值接受的最大長度和最小長度的字符串。長度值是按字符數計算的,1個漢字也是1個字符。默認是最大值。
[Display(Name="姓名")][Required(ErrorMessage="姓名不能為空")][StringLength(6,ErrorMessage="最大長度為6個")]public string Name { get; set; }
此代碼表示Name的值最大為6個字符,如果還要設置最小值,則可以如下設置:
[StringLength(6,MinimumLength=1,ErrorMessage="最大長度為{0}個,最小長度為{1}")]
在ErrorMessage屬性的值中可以使用{0}表示最大值,{1}表示最小值。
四、EmailAddress特性:
使用EmailAddress特性則可以更好的控制電子郵件地址的驗證提示信息。
[Display(Name="郵箱地址")][Required(ErrorMessage="郵箱不可為空")]
[StringLength(255,MinimumLength=20,ErrorMessage="最大為{0}個字符,最小為{1}個字符。")]
[EmailAddress(ErrorMessage="郵箱地址格式不正確")]
public string Email { get; set; }
五、Range特性:
使用Range特性用於指定數值類型的最小值和最大值,支持整數和小數。
[Display(Name="年齡")][Required][Range(1,150)]public int Age { get; set; }
指定年齡的值只能是1到150之間的數字。
六、RegularExpression特性:
RegularExpression特性可以將強大的正則表達式應用於模型對象的屬性上。
[Display(Name="手機號碼")][Required()][RegularExpression("^1{1}[0-9]{10}$",ErrorMessage="手機號不正確")]public string PhoneNumber { get; set; }
那麼對於郵箱的驗證,除了可以使用EmailAddress特性驗證外,還可以使用RegularExpression特性驗證。
七、Compare特性:
一般情況下我們在輸入密碼時,都會讓輸入兩遍,目的就是為了確保兩次輸入的密碼相同,所以在ASP.NET MVC 5中,Compare特性就是為此服務的。可以很輕鬆的實現兩個模型對象的屬性值是否相同。
[Display(Name="密碼")][Required][StringLength(8)]public string Pwd { get; set; }[Display(Name="確認密碼")][Required][StringLength(8)][Compare("Pwd",ErrorMessage="密碼不一致")]public string ConfrimPwd { get; set; }
03第3節:添加驗證文件
對於ASP.NET MVC 5的驗證,微軟使用的是雙重驗證,即客戶端驗證和伺服器端驗證。
客戶端驗證使用的是:<script src="~/Scripts/jquery.validate.js"></script><script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
2. 伺服器端驗證有兩種:
使用C#代碼ModelState.IsValid在控制器中進行判斷。
這兩個JS文件都需要jquery主文件的支持:
<script src="~/Scripts/jquery-1.10.2.js"></script><script src="~/Scripts/jquery.validate.js"></script><script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
在ASP.NET MVC 5中,在視圖模型中提供的模型驗證是雙重驗證,即在客戶端使用JS驗證,也在伺服器端使用C#代碼進行驗證,這樣可以解決當客戶端瀏覽器上的JS被禁用後,其驗證在伺服器端繼續驗證,從而保證提交到伺服器上的數據是正確的。