zoukankan      html  css  js  c++  java
  • 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
        }
    }
    复制代码

    运行效果

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

  • 相关阅读:
    ReentrantLock(重入锁)的源码解析
    vue项目使用vue-photo-preview插件实现点击图片放大预览和移动
    BOM简单总结
    js中属性类型:数据属性与访问器属性
    Javascript面向对象编程(三):非构造函数的继承(对象的深拷贝与浅拷贝)
    Javascript面向对象编程(二):构造函数的继承 作者:yuan一峰
    Javascript 面向对象编程(一):封装 作者:yuan一峰
    js面向对象、创建对象的工厂模式、构造函数模式、原型链模式
    Vue中父子组件执行的先后顺序
    Vue子组件调用父组件的方法
  • 原文地址:https://www.cnblogs.com/Alex80/p/8718685.html
Copyright © 2011-2022 走看看