1. 程式人生 > >MVC2 擴展Models和自定義驗證(學習筆記)

MVC2 擴展Models和自定義驗證(學習筆記)

ttr visual 帳戶 borde turn 頁面 code 字符 pla

當我們利用Visual Studio生成實體類以後,難免會用到驗證功能(例如,用戶登錄時驗證用戶名是否為空,並加以顯示)。

Visual Studio實體類:實體類

技術分享圖片

如果直接去編輯Visual Studio生成的實體類話,當數據庫更新字段後,再次更新實體類的話,會覆蓋我們所添加的驗證代碼。

那麽我們就要避免在Visual Studio生成的類中去進行代碼的編寫。這就需要用到擴展Models類了。

1、讓我們創建一個AccountModels.cs文件.

生成AccountModels,cs文件

技術分享圖片

2、開始編寫AccountModels.cs(模型)文件的代碼,註意註釋的描述,對你的學習很有幫助.

技術分享圖片
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})$") { }
        }
    }
}
技術分享圖片

3、編寫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>
技術分享圖片


4、編寫Controllers(控制器)

技術分享圖片
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
    }
}
技術分享圖片

運行效果

技術分享圖片
以上為全部代碼。如有問題可留言.

MVC2 擴展Models和自定義驗證(學習筆記)