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
        }
    }
    复制代码

    运行效果

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

  • 相关阅读:
    HTML DOM 06 节点关系
    HTML DOM 05 事件(三)
    HTML DOM 05 事件(二)
    HTML DOM 05 事件(一)
    html DOM 04 样式
    html DOM 03 节点的属性
    html DOM 02 获取节点
    html DOM 01 节点概念
    JavaScript 29 计时器
    JavaScript 28 弹出框
  • 原文地址:https://www.cnblogs.com/Alex80/p/8718685.html
Copyright © 2011-2022 走看看