當咱們利用Visual Studio生成實體類之後,不免會用到驗證功能(例如,用戶登陸時驗證用戶名是否爲空,並加以顯示)。javascript
Visual Studio實體類:實體類html
若是直接去編輯Visual Studio生成的實體類話,當數據庫更新字段後,再次更新實體類的話,會覆蓋咱們所添加的驗證代碼。java
那麼咱們就要避免在Visual Studio生成的類中去進行代碼的編寫。這就須要用到擴展Models類了。正則表達式
一、讓咱們建立一個AccountModels.cs文件.數據庫
生成AccountModels,cs文件安全
二、開始編寫AccountModels.cs(模型)文件的代碼,注意註釋的描述,對你的學習頗有幫助.ide
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations;//所添加的自定義驗證引用 using System.ComponentModel;//所添加的自定義驗證引用 namespace MvcTest.Models { /// <summary> /// 指定元數據類 /// </summary> [MetadataType(typeof(MemberMetadata))] //類名與MvcTest.edmx的表名相同,partial爲局部類型修飾詞,用來和實體數據類進行整合 public partial class Member { public class MemberMetadata { [DisplayName("用戶id")] public int Id { get; set; } [Required]//必須字符 [DisplayName("用戶名")]//定義說明文字,調用方法:<%: Html.LabelFor(m => m.UserName) %> public string UserName { get; set; } [Required] [StringMinLength(6, 18, ErrorMessage = "密碼大於6,小於18")]//自定義驗證,下面有代碼 [DataType(DataType.Password)] [DisplayName("密碼")] public string PassWord { get; set; } [Required] [Email(ErrorMessage = "請輸入正確的Email")]//自定義驗證,下面有代碼 [DisplayName("Email")] public string Email { get; set; } [Required] [DisplayName("建立時間")] public DateTime CreateTime { get; set; } [Required] [DisplayName("最後登陸時間")] public DateTime LogonTime { get; set; } [Required] [DisplayName("安全問題")] public string Quesion { get; set; } [Required] [DisplayName("安全答案")] public string Answer { get; set; } } /// <summary> /// 定義StringMinLength類,繼承ValidationAttribute驗證基礎類 /// </summary> public class StringMinLength : ValidationAttribute { private int _MinLength; private int _MaxLength; /// <summary> /// 定義方法,進行賦值 /// </summary> /// <param name="MinLength">最小值</param> /// <param name="MaxLength">最大值</param> public StringMinLength(int MinLength, int MaxLength) { _MinLength = MinLength; _MaxLength = MaxLength; } /// <summary> /// 重寫IsValid方法 /// </summary> /// <param name="value">驗證時所傳入的值,無論StringMinLength()方法定義幾個參數,重寫時只這樣寫:IsValid(object value)</param> /// <returns>override重寫修飾符</returns> public override bool IsValid(object value) { if (value.ToString().Length < _MinLength) { return false; } if (value.ToString().Length > _MaxLength) { return false; } return true; } } /// <summary> /// 定義EmailAttribute類,繼承RegularExpressionAttribute正則表達式類,作驗證使用,可重複調用 /// </summary> public class EmailAttribute : RegularExpressionAttribute { // base 關鍵字用於從派生類中訪問基類的成員 public EmailAttribute() : base(@"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4})$") { } } } }
三、編寫View(視圖)代碼.View咱們用的是強類型綁定,還須要調用三個js,由於View用了母版頁.因此另貼代碼.這三個JS是驗證時必須調用的.學習
<head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title> </title> <script type="text/javascript" src="../../Scripts/MicrosoftAjax.js"></script> <script type="text/javascript" src="../../Scripts/MicrosoftMvcAjax.js"></script> <script type="text/javascript" src="../../Scripts/MicrosoftMvcValidation.js"></script> </head>
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcTest.Models.Member>" %> <%--Inherits="System.Web.Mvc.ViewPage<MvcTest.Models.Member>" 強類型--%> <asp:Content ID="registerTitle" ContentPlaceHolderID="TitleContent" runat="server"> 註冊 </asp:Content> <asp:Content ID="registerContent" ContentPlaceHolderID="MainContent" runat="server"> <h2> 建立新賬戶</h2> <p> 使用如下表單建立新賬戶。 </p> <%--啓用驗證方法,必須在第一個using (Html.BeginForm())上面,Html的<form>標籤無效--%> <%Html.EnableClientValidation(); %> <%--生成form表單--%> <% using (Html.BeginForm()) { %> <div> <fieldset> <legend>賬戶信息</legend> <div class="editor-label"> <%: Html.LabelFor(m => m.UserName) %> </div> <div class="editor-field"> <%: Html.TextBoxFor(m => m.UserName) %> <%--驗證失敗時所顯示的錯誤信息--%> <%: Html.ValidationMessageFor(m => m.UserName) %> </div> <div class="editor-label"> <%: Html.LabelFor(m => m.PassWord) %> </div> <div class="editor-field"> <%: Html.PasswordFor(m => m.PassWord)%> <%: Html.ValidationMessageFor(m => m.PassWord)%> </div> <div class="editor-label"> <%: Html.LabelFor(m => m.Email) %> </div> <div class="editor-field"> <%: Html.TextBoxFor(m => m.Email) %> <%: Html.ValidationMessageFor(m => m.Email) %> </div> <div class="editor-label"> <%: Html.LabelFor(m => m.Quesion) %> </div> <div class="editor-field"> <%: Html.TextBoxFor(m => m.Quesion)%> <%: Html.ValidationMessageFor(m => m.Quesion)%> </div> <div class="editor-label"> <%: Html.LabelFor(m => m.Answer) %> </div> <div class="editor-field"> <%: Html.TextBoxFor(m => m.Answer)%> <%: Html.ValidationMessageFor(m => m.Answer)%> </div> <p> <input type="submit" value="註冊" /> </p> </fieldset> </div> <% } %> </asp:Content>
四、編寫Controllers(控制器)
ui
using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Security.Principal; using System.Web; using System.Web.Mvc; using System.Web.Routing; using System.Web.Security; using MvcTest.Models;//須要using Models. namespace MvcTest.Controllers { [HandleError]//處理由操做方法引起的異常 public class AccountController : Controller { //new實體類 MvcTestEntities db = new MvcTestEntities(); #region 註冊 public ActionResult Register() { return View(); } [HttpPost]//爲了不在表單未提交的時候訪問此註冊方法,需加[HttpPost],只有經過在本頁面經過Post傳輸方式提交的表單纔會訪問此方法 public ActionResult Register(Models.Member member) { //作驗證判斷,若是經過則執行數據庫寫入代碼 if (ModelState.IsValid) { db.AddToMember(new Models.Member { UserName = member.UserName, PassWord = member.PassWord, Email = member.Email, Quesion = member.Quesion, Answer = member.Answer, CreateTime = DateTime.Now, LogonTime = DateTime.Now }); db.SaveChanges(); //跳轉頁面.參數1:操做名稱,參數2:路由參數 return RedirectToAction("Index", "Home"); } return View(); } #endregion } }
運行效果spa