【MVC】会员注册/登录,普通验证,会员名是否注册Ajax验证以及会员邮件验证实现原理
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations; namespace MvcTest.Models
{
public partial class Member
{
public int Id { get; set; } [DisplayName("会员账号")]
[Required(ErrorMessage = "请输入 Email 地址")]
[Description("我们直接以 Email 当成会员的登录账号")]
[MaxLength(250, ErrorMessage = "Email地址长度无法超过250个字符")]
[DataType(DataType.EmailAddress)]
[Remote("CheckDup", "Member", HttpMethod = "POST", ErrorMessage = "您输入的 Email 已经有人注册过了!")]
public string Email { get; set; } [DisplayName("会员密码")]
[Required(ErrorMessage = "请输入密码")]
[MaxLength(40, ErrorMessage = "请输入密码")]
[DataType(DataType.Password)]
public string Password { get; set; } [DisplayName("中文姓名")]
[Required(ErrorMessage = "请输入中文姓名")]
[MaxLength(5, ErrorMessage = "中文姓名不可超过5个字")]
[Description("暂不考虑外国人用英文注册会员的情况")]
public string Username { get; set; } [DisplayName("会员昵称")]
[Required(ErrorMessage = "请输入会员昵称")]
[MaxLength(10, ErrorMessage = "会员昵称请勿输入超过10个字")]
public string Nickname { get; set; } [DisplayName("会员注册时间")]
public DateTime RegisterOn { get; set; } [DisplayName("会员启用认证码")]
[MaxLength(36)]
[Description("当 AuthCode 等于 null 则代表此会员已经通过Email有效性验证")]
public string AuthCode { get; set; }
}
}
using System.ComponentModel;
using System.ComponentModel.DataAnnotations; namespace MvcTest.Models
{
public class MemberLoginViewModel
{
[DisplayName("会员账号")]
[DataType(DataType.EmailAddress, ErrorMessage = "请输入您的 Email 地址")]
[Required(ErrorMessage = "请输入{0}")]
public string email { get; set; } [DisplayName("会员密码")]
[DataType(DataType.Password)]
[Required(ErrorMessage = "请输入{0}")]
public string password { get; set; }
}
}
控制器部分
using MvcTest.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Web;
using System.Web.Mvc;
using System.Web.Security; namespace MvcShopping.Controllers
{
public class MemberController : Controller
{
protected testContext db = new testContext(); // 会员注册页面
public ActionResult Register()
{
return View();
} // 写入会员资料
[HttpPost]
public ActionResult Register([Bind(Exclude="RegisterOn,AuthCode")] Member member)
{
// 检查会员是否存在
var chk_member = db.Members.Where(p => p.Email == member.Email).FirstOrDefault();
if (chk_member != null)
{
ModelState.AddModelError("Email", "您输入的 Email 已经有人注册过了!");
} if (ModelState.IsValid)
{
// 会员注册时间
member.RegisterOn = DateTime.Now;
// 会员验证码,采用 Guid 当成验证内容,避免有会员使用到重复的验证码
member.AuthCode = Guid.NewGuid().ToString(); db.Members.Add(member);
db.SaveChanges(); return RedirectToAction("Login", "Member");
}
else
{
return View();
}
} private void SendAuthCodeToMember(Member member)
{
// 准备发送邮件内容
string mailBody = System.IO.File.ReadAllText(Server.MapPath("~/App_Data/MemberRegisterEMailTemplate.htm")); mailBody = mailBody.Replace("{{Name}}", member.Username);
mailBody = mailBody.Replace("{{RegisterOn}}", member.RegisterOn.ToString("F"));
var auth_url = new UriBuilder(Request.Url)
{
Path = Url.Action("ValidateRegister", new { id = member.AuthCode }),
Query = ""
};
mailBody = mailBody.Replace("{{AUTH_URL}}", auth_url.ToString()); // 发送邮件给会员
try
{
SmtpClient SmtpServer = new SmtpClient("smtp.126.com");
//SmtpServer.Port = 587;
SmtpServer.Credentials = new System.Net.NetworkCredential("yourname@126.com", "password");
SmtpServer.EnableSsl = true; MailMessage mail = new MailMessage();
mail.From = new MailAddress("yourname@126.com");
mail.To.Add(member.Email);
mail.Subject = "会员注册确认信";
mail.Body = mailBody;
mail.IsBodyHtml = true; SmtpServer.Send(mail);
}
catch (Exception ex)
{
throw ex;
// 发送邮件寄送失败,需记录到数据库备查,以免有会员无法登录
}
} public ActionResult ValidateRegister(string id)
{
if (String.IsNullOrEmpty(id))
return HttpNotFound(); var member = db.Members.Where(p => p.AuthCode == id).FirstOrDefault(); if (member != null)
{
TempData["LastTempMessage"] = "会员验证成功,您现在可以登入网站了!";
//邮件点击验证成功后要将 member.AuthCode 的内容清空
member.AuthCode = null;
db.SaveChanges();
}
else
{
TempData["LastTempMessage"] = "查无此会员验证码,您可能已经验证过了!";
} return RedirectToAction("Login", "Member");
} // 显示会员登录页面
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl; return View();
} // 执行会员登录
[HttpPost]
public ActionResult Login(string email, string password, string returnUrl)
{
if (ValidateUser(email, password))
{
FormsAuthentication.SetAuthCookie(email, false); if (String.IsNullOrEmpty(returnUrl)) {
return RedirectToAction("Index", "Home");
} else {
return Redirect(returnUrl);
}
} return View();
} private bool ValidateUser(string email, string password)
{
var hash_pw = password; var member = (from p in db.Members
where p.Email == email && p.Password == hash_pw
select p).FirstOrDefault(); // 如果 member 模型 null 则代表输入的用户名和密码正确
if (member != null) {
if (member.AuthCode == null) {
return true;
} else {
ModelState.AddModelError("", "您尚未通过会员验证,请查收邮件点击会员验证链接!");
return false;
}
} else {
ModelState.AddModelError("", "您输入的用户名或密码错误!");
return false;
}
} // 执行会员注销登录
public ActionResult Logout()
{
// 清除 Cookies
FormsAuthentication.SignOut(); // 清除所有曾经写入过的 Session 资料
Session.Clear(); return RedirectToAction("Index", "Home");
} [HttpPost]
public ActionResult CheckDup(string Email)
{
var member = db.Members.Where(p => p.Email == Email).FirstOrDefault(); if (member != null)
return Json(false);
else
return Json(true);
} }
}
视图部分
@model MvcTest.Models.MemberLoginViewModel
<h2>会员登录</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>请输入你的用户名和密码</legend>
<div class="editor-label">
@Html.LabelFor(model => model.email)
</div>
<div class="editor-field">
@*@Html.EditorFor(model => model.email)*@
@Html.TextBoxFor(model => model.email, new { data_val_email = "请输入 Email 地址" })
@Html.ValidationMessageFor(model => model.email)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.password)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.password)
@Html.ValidationMessageFor(model => model.password)
</div>
<p>
<input type="submit" value="登录" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("注册账号", "Register", "Member")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
@if (TempData["LastTempMessage"] != null)
{
<script>
alert('@HttpUtility.JavaScriptStringEncode(Convert.ToString(TempData["LastTempMessage"]))');
</script>
}
}
@model MvcTest.Models.Member
<h2>会员注册</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>请输入会员注册资料</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Email)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Email)
@Html.ValidationMessageFor(model => model.Email)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Password)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Password)
@Html.ValidationMessageFor(model => model.Password)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Username)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Username)
@Html.ValidationMessageFor(model => model.Username)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Nickname)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Nickname)
@Html.ValidationMessageFor(model => model.Nickname)
</div>
<p>
<input type="submit" value="注册" />
</p>
</fieldset>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
确认邮件模板
<!DOCTYPE html>
<html>
<body>
<h1>会员注册确认信</h1>
<p>亲爱的 {{Name}} 您好:</p>
<p>
由于您在 {{RegisterOn}} 注册成为本站会员,为了完成会员注册程序,请您点击以下链接用以确认您的Email地址是有效的:
<br />
<a href="{{AUTH_URL}}" target="_blank">{{AUTH_URL}}</a>
</p>
</body>
</html>

【MVC】会员注册/登录,普通验证,会员名是否注册Ajax验证以及会员邮件验证实现原理的更多相关文章
- 第一百八十六节,jQuery,验证表单插件,Ajax 表单插件,验证和提交表单
jQuery,验证表单插件,Ajax 表单插件,验证和提交表单 HTML <form id="reg" method="post" action=&quo ...
- Discuz! X2.5判断会员登录状态及外部调用注册登录框
Discuz! X2.5判断会员登录状态及外部调用注册登录框 有关discuz论坛会员信息,收集的一些资料: 用dedecms+discuz做了个门户加论坛形式的网站,但是dedecms顶部目前只能q ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框 ...
- SpringBoot注册登录(三):注册--验证账号密码是否符合格式及后台完成注册功能
SpringBoot注册登录(一):User表的设计点击打开链接SpringBoot注册登录(二):注册---验证码kaptcha的实现点击打开链接 SpringBoot注册登录(三):注册 ...
- 巨蟒django之CRM1 需求分析&&表结构设计&&注册登录验证
1.需求分析 .项目 ()业务 ()权限的管理 .CRM customer relationship management 客户关系管理系统 .谁来使用CRM? 销售&&班主任& ...
- 使用MVC的实现登录注册功能
文章目录 1.视图层(View)页面的编写: 1.1.登录页面 1.2.注册页面 2.控制层(Controller)的编写 2.1. 注册 2.2 .登录 2.3 .实体类 3.Model层(Mode ...
- 原生js验证简洁美观注册登录页面
序 一个以js验证表单的简洁的注册登录页面,不多说直接上图 效果 主要文件 完整代码 sign_up.html 注册表单 <!DOCTYPE html> <html lang=&qu ...
- 注册登录页面修订-Python使用redis-手机验证接口-发送短信验证
登录页面修订 views.Login.vue <template> <div class="login box"> <img src="@/ ...
- 一步步开发自己的博客 .NET版(3、注册登录功能)
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做 ...
随机推荐
- 编程零基础应当如何开始学习 Python?
提前说一下,这篇福利多多,别的不说,直接让你玩回最有手感的怀旧游戏,参数贴图很方便自己可以根据喜好修改哦. 本篇通过以下四块展开,提供大量资源对应. 选一个好版本 有没有看过<在下坂本,有何贵干 ...
- JS中event.keyCode用法及keyCode对…
js中event.keyCode用法及keyCode对照表 标签: javascriptJavaScriptJavascriptjavaScript 2012-12-11 15:11 HTML Jav ...
- Jquery的同步和异步请求
1 异步请求: 1.1 $.ajax $.ajax({ url : 'your url', data:{name:valu ...
- 201521123001《Java程序设计》第11周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...
- Eclipse rap 富客户端开发总结(13) :Rap/Rcp保存按钮处理方式
一.概述 在做项目的过程中,处理编辑区的保存机制的时候.发现,同样是扩展eclipse 自带的保存和全部保存按钮时候,rcp 工程下,保存按钮可以正常的灰显和可用,但是rap 的按钮就是始终呈现灰显的 ...
- Java并发之线程间的协作
上篇文章我们介绍了synchronized关键字,使用它可以有效的解决我们多线程所带来的一些常见问题.例如:竞态条件,内存可见性等.并且,我们也说明了该关键字主要是一个加锁和释放锁的集成,所有为能获得 ...
- Wrong FS: hdfs://......, expected: file:///
单机版使用的是FileSystem类的静态函数: FileSystem hdfs = FileSystem.get(conf) 伪分布式下需要使用Path来获得 Path path = new Pat ...
- JavaScript一些常用方法一
整理以前的笔记,在学习JavaScript时候,经常会用到一些方法,但是有时忘掉了具体用法,因此记下.方便以后查阅. 这篇博文先说明这些方法的用途: splice().push().pop() .sh ...
- Java为什么把String设计成不可变的(immutable)
在java中,String是字符串常量,可以从内存,同步机制,数据结构等方面分析 1:字符串中常量池的需要 String不同于普通基础变量类型的地方在于对象.java中的字符串对象都保存在字符串常量池 ...
- Pagination(分页) 从前台到后端总结
一:效果图 下面我先上网页前台和管理端的部分分页效果图,他们用的是一套代码. 回到顶部(go to top) 二:上代码前的一些知识 ...