MVC中通過Model在頁面間傳值使的程序開發變得更加的快捷,但是很多時候,我們在數據傳遞的時候為了確保數據的有效性,要對Model的相關屬性做基本的數據驗證。
不多說直接上個代碼,Model的實體類
public class BadDebt { public int DebtId { get; set; } [Required(ErrorMessage = "不能為空!")] [RegularExpression("^\\w{1,20}$", ErrorMessage = "工作編號須為數字類型")] public string JobNo { get; set; } [Required(ErrorMessage = "不能為空!")] public bool HasContract { get; set; } [Required(ErrorMessage = "不能為空!")] public bool HasLeader { get; set; } [Required(ErrorMessage = "不能為空!")] [RegularExpression("^\\d{0,12}(.\\d{1,4})?$", ErrorMessage = "格式錯誤 如:999.9999")] //\\d{1,12}(.\\d{1,4})? public decimal Cost { get; set; } [Required(ErrorMessage = "不能為空!")] [StringLength(20, ErrorMessage = "填寫正確的銷售員姓名")] public string Salesman { get; set; } [StringLength(255)] public string Reason { get; set; } [DataType(DataType.Date)] public DateTime? CheckInTime { get; set; } [Required(ErrorMessage = "不能為空!")] [DataType(DataType.Date, ErrorMessage = "請填寫正確的壞賬時間")] public DateTime BadDebtTime { get; set; } }
這里面包含了基本的數據非空驗證,長度驗證,日期格式驗證,時間驗證等,這些都是可以自定義的
View視圖中添加驗證信息
1 <tr> 2 <td width="120" height="35" align="right">工作編號:</td> 3 <td width="316"> 4 <label> 5 @Html.HiddenFor(m => m.DebtId) 6 @Html.TextBoxFor(m => m.JobNo, new { @class = "input_pt_c" }) 7 @Html.ValidationMessageFor(m => m.JobNo) 8 </label> 9 </td> 10 </tr> 11 <tr> 12 <td height="35" align="right">銷售員:</td> 13 <td> 14 <label> 15 @Html.TextBoxFor(m => m.Salesman, new { @class = "input_pt_c" }) 16 @Html.ValidationMessageFor(m => m.Salesman) 17 </label> 18 </td> 19 </tr> 20 <tr> 21 <td height="35" align="right">有無帶隊人:</td> 22 <td> 23 @Html.RadioButtonFor(m => m.HasLeader, true)有帶隊人 24 @Html.RadioButtonFor(m => m.HasLeader, false)無帶隊人 25 </td> 26 </tr>
。。。。。。。。。。。。。。。。。。。。。。。。。。。。
寫上
@Html.ValidationMessageFor(m => m.JobNo)
后微軟會自動生成程序鎖需要的驗證信息,加上隱藏域存放他的Id是為了方便操作
所有的也買年驗證信息都存放進了ModelState這個類中,可以通過這個類在Controller中添加驗證信息,方法是
if (badDeb.Salesman != null && !GetListSaler().Contains(badDeb.Salesman)) //驗證所寫的銷售人員在公司銷售人員名單上 { ModelState.AddModelError("Salesman", "銷售員必須包含在銷售人員表中"); }
只有當所有的驗證信息都通過的時候
ModelState.IsValid 的值才會為True,通過驗證
看下View頁面效果
這就是微軟自帶的驗證方式,是不是看起來樣子不一樣,你右擊查看源文件會看到
<input class="input-validation-error" data-val="true" data-val-number="字段 DebtId 必須是一個數字。" data-val-required="DebtId 字段是必需的。" id="DebtId" name="DebtId" type="hidden" value="" />
<input class="input-validation-error input_pt_c" data-val="true" data-val-regex="工作編號須為數字類型" data-val-regex-pattern="^\w{1,20}$" data-val-required="不能為空!" id="JobNo" name="JobNo" type="text" value="" />
<span class="field-validation-error" data-valmsg-for="JobNo" data-valmsg-replace="true">不能為空!
生成的頁面樣式的固定的所以只要在樣式表中修改對應的樣式就可了一了
理論上這樣就完成了數據的驗證,這里的數據驗證包含了數據庫驗證,Model類驗證,以及在Controller驗證,這就完成了頁面的新增,但是在做數據的修改的時候,由於數據的ID在數據庫設計的時候是自動增長的,所以即使通過隱藏域獲得了這條數據的ID,但是這個值在把這條數據加載到頁面並修改后提交的時候還是不可避免的丟失了,這樣導致了ModelState.IsValid 的值一直為false,刪除頁面隱藏域的話修改到時沒有問題但是新增又會遇到問題。
這時候就想能不能不驗證ModelState里面的一個信息,仔細查了MSDN的屬性,發現了他有一個Remove()方法,參數是key,試一下
ModelState.Remove("DebtId");
OK 驗證通過 ,這下就完美了