MVC2 扩展Models和自定义验证(学习笔记)

当我们利用Visual Studio生成实体类以后,难免会用到验证功能(例如,用户登录时验证用户名是否为空,并加以显示)。

Visual Studio实体类:实体类

实体类

如果直接去编辑Visual Studio生成的实体类话,当数据库更新字段后,再次更新实体类的话,会覆盖我们所添加的验证代码。

那么我们就要避免在Visual Studio生成的类中去进行代码的编写。这就需要用到扩展Models类了。

1、让我们创建一个AccountModels.cs文件.

生成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

    }

}

运行效果

运行效果
以上为全部代码。如有问题可留言.

你可能感兴趣的:(Model)