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. 如何解决xshell中无法输入中文的问题

    自从安上了xshell以后,用着那叫一个顺手,美中不足的就是一直无法输入中文.不过,既然学习IT,就要习惯英文嘛~直到--我遇到了脚本,写好一个脚本,必要的注释是少不了的,但是作为一个英文渣渣,我真的 ...

  2. [转载]C header files matching your running 

    原文地址:C header files matching your running kernel were not found.作者:[Opser]小默 c header files matching ...

  3. MySQLzip archive版本(5.7.19)安装教程

    1.  从官网下载zip archive版本http://dev.mysql.com/downloads/mysql/ 2. 解压缩至相应目录,并配置环境变量(将*\bin添加进path中): 3. ...

  4. SNS团队第二次站立会议(2017.04.23)

    一.当天站立式会议照片 本次会议主要内容:汇报工作进度,根据完成情况调整进度 二.每个人的工作 成员 今天已完成的工作 明天计划完成的工作 罗于婕 梳理清楚数据的每个类型和数据项  具体落实把相关数据 ...

  5. 201521123069 《Java程序设计》 第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料: XMind List列表:元素以线性方式存放,允许有重复的对象. Set集:集合中的对象不按特定的方式排序,并且 ...

  6. 201521123044 《Java程序设计》第14周学习总结

    1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 友情提示:导图用ctrl+鼠标滚轮放大看更清楚些 2. 书面作业 1. MySQL数据库基本操作 建立数据库, ...

  7. 201521123044 《Java程序设计》第11周学习总结

    1. 本章学习总结 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问, ...

  8. 201521123062《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  9. 201521123049 《JAVA程序设计》 第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

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

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 1.1建立数据库,将自己的姓名.学号作为一条记录插入.(截图, ...