当我们利用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和自定义验证(学习笔记)
原文地址:https://www.cnblogs.com/Alex80/p/8718685.html