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验证以及会员邮件验证实现原理的更多相关文章

  1. 第一百八十六节,jQuery,验证表单插件,Ajax 表单插件,验证和提交表单

    jQuery,验证表单插件,Ajax 表单插件,验证和提交表单 HTML <form id="reg" method="post" action=&quo ...

  2. Discuz! X2.5判断会员登录状态及外部调用注册登录框

    Discuz! X2.5判断会员登录状态及外部调用注册登录框 有关discuz论坛会员信息,收集的一些资料: 用dedecms+discuz做了个门户加论坛形式的网站,但是dedecms顶部目前只能q ...

  3. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框 ...

  4. SpringBoot注册登录(三):注册--验证账号密码是否符合格式及后台完成注册功能

    SpringBoot注册登录(一):User表的设计点击打开链接SpringBoot注册登录(二):注册---验证码kaptcha的实现点击打开链接      SpringBoot注册登录(三):注册 ...

  5. 巨蟒django之CRM1 需求分析&&表结构设计&&注册登录验证

    1.需求分析 .项目 ()业务 ()权限的管理 .CRM customer relationship management 客户关系管理系统 .谁来使用CRM? 销售&&班主任& ...

  6. 使用MVC的实现登录注册功能

    文章目录 1.视图层(View)页面的编写: 1.1.登录页面 1.2.注册页面 2.控制层(Controller)的编写 2.1. 注册 2.2 .登录 2.3 .实体类 3.Model层(Mode ...

  7. 原生js验证简洁美观注册登录页面

    序 一个以js验证表单的简洁的注册登录页面,不多说直接上图 效果 主要文件 完整代码 sign_up.html 注册表单 <!DOCTYPE html> <html lang=&qu ...

  8. 注册登录页面修订-Python使用redis-手机验证接口-发送短信验证

    登录页面修订 views.Login.vue <template> <div class="login box"> <img src="@/ ...

  9. 一步步开发自己的博客 .NET版(3、注册登录功能)

    前言 这次开发的博客主要功能或特点:    第一:可以兼容各终端,特别是手机端.    第二:到时会用到大量html5,炫啊.    第三:导入博客园的精华文章,并做分类.(不要封我)    第四:做 ...

随机推荐

  1. Python中os和shutil模块实用方法集…

    Python中os和shutil模块实用方法集锦 类型:转载 时间:2014-05-13 这篇文章主要介绍了Python中os和shutil模块实用方法集锦,需要的朋友可以参考下 复制代码代码如下: ...

  2. 201521123012 《Java程序设计》第四周学习总结

    1.本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容 答:(1)extends关键字 <1>只能有一个父类,即单继承 <1>子 ...

  3. Java课程设计--GUI密码生成器201521123033

    1.团队课程设计题目 基于GUI的密码生成器 团队博客链接 2.个人负责模块 (1)界面设计 (2)部分错误输入的提示 (3)一键复制密码功能的实现 3.个人代码的提交记录截图 4.个人代码展示以及代 ...

  4. java课程设计——猜数游戏

    1.团队课程设计博客链接 http://www.cnblogs.com/springbreezemiles/p/7064135.html 2.个人负责模块或任务说明 本人任务: 编写主界面以及排行榜代 ...

  5. JavaEE学习路线

    针对很多初识Java者,对如何学习Java.如何学好Java很迷茫,最近刚把JavaEE的东西学完,把我的学习的经验分享给大家,一条适合大多数人的学习路线. 第一部分:Java语言入门阶段 第二部分: ...

  6. angular之$watch方法详解

    在$apply方法中提到过脏检查,首先apply方法会触发evel方法,当evel方法解析成功后,会去触发digest方法,digest方法会触发watch方法. (1)$watch简介 在diges ...

  7. 查找Oracle数据库中的重复记录

    本文介绍了几种快速查找ORACLE数据库中的重复记录的方法. 下面以表table_name为例,介绍三种不同的方法来确定库表中重复的记录 方法1:利用分组函数查找表中的重复行:按照某个字段分组,找出行 ...

  8. 如何用kaldi做孤立词识别-初版

    ---------------------------------------------------------------------------------------------------- ...

  9. Codeforces Round #436 (Div. 2) E. Fire

    http://codeforces.com/contest/864/problem/E 题意: 有一堆物品,每个物品有3个属性,需要的时间,失效的时间(一开始)和价值.只能一件一件的选择物品(即在选择 ...

  10. vue2.0 网页标题更新实现思路

    一.注册全局指令 1.注册一个全局指令 Vue.directive('title', { inserted: function (el, binding) { document.title = el. ...