MVC2 扩展Models和自定义验证(学习笔记)
当我们利用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和自定义验证(学习笔记)的更多相关文章
- 扩展jquery.validate自定义验证,自定义提示,本地化
<!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...
- Angular.js之服务与自定义服务学习笔记
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Angular.js之自定义指令学习笔记
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- sql server自定义函数学习笔记
sql server中函数分别有:表值函数.标量函数.聚合函数.系统函数.这些函数中除系统函数外其他函数都需要用户进行自定义. 一.表值函数 简单表值函数 创建 create function fu_ ...
- Android自定义View学习笔记(一)
绘制基础 参考:HenCoder Android 开发进阶: 自定义 View 1-1 绘制基础 Paint详解 参考:HenCoder Android 开发进阶: 自定义 View 1-2 Pain ...
- Java SpringBoot 如何使用 IdentityServer4 作为验证学习笔记
这边记录下如何使用IdentityServer4 作为 Java SpringBoot 的 认证服务器和令牌颁发服务器.本人也是新手,所以理解不足的地方请多多指教.另外由于真的很久没有写中文了,用词不 ...
- 【转载】自定义View学习笔记之详解onMeasure
网上对自定义View总结的文章都很多,但是自己还是写一篇,好记性不如多敲字! 其实自定义View就是三大流程,onMeasure.onLayout.onDraw.看名字就知道,onMeasure是用来 ...
- Kotlin学习笔记(9)- 数据类
系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步! Kotlin学习笔记(1)- 环境配置 Kotlin学习笔记(2)- 空安 ...
- python3.4学习笔记(二十五) Python 调用mysql redis实例代码
python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...
随机推荐
- 如何用Client OM获取页面上一个Content web part的内容
[解决方法] According to Wictor Wilén, The Client Object Model is fairly limited when it comes to working ...
- OpenGL ES 3.0之Fragment buffer objects(FBO)详解(二)
我们可以使用帧缓冲对象来实现离屏渲染.帧缓冲对象支持下列操作 1.只使用OpenGL ES 函数创建帧缓冲区对象. 2.使用EGL context创建多个FBO. 3.创建离屏颜色.深度.模板渲染缓冲 ...
- 局域网内主机ssh访问服务器宿主下VMWare 虚拟机(Ubuntu 12.04.1)并且实现虚拟机能上网的那点事
(1)首先虚拟机已安装ssh服务 1) 自动安装 ssh 服务 apt-get install openssh-server 安装完成后,将自动开启 ssh 服务. 2) 查看 ssh 服务是否已开启 ...
- vue循环中的v-show
v-show如果使用循环对象的属性来时控制, 这个属性必须是加载时就存在的 <div class="list-group col-sm-12" v-for="(is ...
- APP注册邀请码
小火箭:MrZOpba685OMLSpanBKFtkxcQf5eGOY 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论
- MongoDB副本集配置系列六:定位MongoDB慢的原因
1:想知道哪些操作拖慢了MongoDB的速度,首先需要检查当前正在执行哪些操作. gechongrepl:PRIMARY> db.currentOp() "opid" : 7 ...
- secureCRT,永久设置,保护眼睛,配色方案
配色后效果如下: 下面开始配色 1.选项(Options)==>会话选项(Sessions options)==>终端(Terminal)==>仿真(Emulation) 按图中标注 ...
- Canvas动画 位图缓存提高效率和对应的内存问题
对一个矢量图动画,开启位图缓存能大大提高运行效率.所谓开启位图缓存,其实要自己动手,先创建一个临时canvas,然后把矢量图绘制到这个canvas上,到了实际绘制时,直接把这个临时canvas拷贝到真 ...
- cocos2d-js 3.0 RC0 手动绑定 C++调用js,js调用C++ jsbinding
参考:http://www.tairan.com/archives/4902 参考文章是2.x版本的,对于3.0也许不合适了,没有深究. 代码:https://github.com/kenkozhen ...
- [dubbo实战] dubbo+zookeeper伪集群搭建 (转)
zookeeper作为注册中心,服务器和客户端都要访问,如果有大量的并发,肯定会有等待.所以可以通过zookeeper集群解决. 一.为什么需要zookeeper呢? 大部分分布式应用需要一 个主控. ...