MVC4制作網(wǎng)站教程第二章 部分用戶(hù)功能實(shí)現(xiàn)代碼
用戶(hù)部分要實(shí)現(xiàn)的功能有:
序
一、用戶(hù)
1.1用戶(hù)注冊(cè)
1.2用戶(hù)登錄
1.3修改密碼
1.4修改資料
要實(shí)現(xiàn)這些目的首先新建用戶(hù)(Model)模型
/// <summary> /// 用戶(hù)模型 /// </summary> public class User { [Key] public int UserId { get; set; } /// <summary> /// 用戶(hù)組Id /// </summary> [Display(Name="用戶(hù)組Id")] [Required(ErrorMessage = "×")] public int GroupId { get; set; } /// <summary> /// 用戶(hù)名 /// </summary> [Display(Name="用戶(hù)名",Description="4-20個(gè)字符。")] [Required(ErrorMessage = "×")] [StringLength(20, MinimumLength = 4, ErrorMessage = "×")] public string UserName { get; set; } /// <summary> /// 密碼 /// </summary> [Required] [StringLength(256)] public string Password { get; set; } /// <summary> /// 性別【0-男;1-女;2-保密】 /// </summary> [Display(Name="性別")] [Required(ErrorMessage = "×")] [Range(0,2,ErrorMessage = "×")] public byte Gender { get; set; } /// <summary> /// Email /// </summary> [Display(Name="Email",Description="請(qǐng)輸入您常用的Email。")] [Required(ErrorMessage = "×")] [EmailAddress(ErrorMessage = "×")] public string Email { get; set; } /// <summary> /// 密保問(wèn)題 /// </summary> [Display(Name="密保問(wèn)題",Description="請(qǐng)正確填寫(xiě),在您忘記密碼時(shí)用戶(hù)找回密碼。4-20個(gè)字符。")] [Required(ErrorMessage = "×")] [StringLength(20, MinimumLength = 4, ErrorMessage = "×")] public string SecurityQuestion { get; set; } /// <summary> /// 密保答案 /// </summary> [Display(Name="密保答案",Description="請(qǐng)認(rèn)真填寫(xiě),忘記密碼后回答正確才能找回密碼。2-20個(gè)字符。")] [Required(ErrorMessage = "×")] [StringLength(20, MinimumLength = 2, ErrorMessage = "×")] public string SecurityAnswer { get; set; } /// <summary> /// QQ號(hào)碼 /// </summary> [Display(Name="QQ號(hào)碼")] [RegularExpression("^[1-9][0-9]{4-13]$",ErrorMessage = "×")] [StringLength(12, MinimumLength = 6, ErrorMessage = "×")] public string QQ { get; set; } /// <summary> /// 電話(huà)號(hào)碼 /// </summary> [Display(Name="電話(huà)號(hào)碼",Description="常用的聯(lián)系電話(huà)(手機(jī)或固話(huà)),固話(huà)格式為:區(qū)號(hào)-號(hào)碼。")] [RegularExpression("^[0-9-]{11-13}$",ErrorMessage = "×")] public string Tel { get; set; } /// <summary> /// 聯(lián)系地址 /// </summary> [Display(Name="聯(lián)系地址",Description="常用地址,最多80個(gè)字符。")] [StringLength(80, ErrorMessage = "×")] public string Address { get; set; } /// <summary> /// 郵編 /// </summary> [Display(Name="郵編")] [RegularExpression("^[0-9]{6}$",ErrorMessage = "×")] public string PostCode { get; set; } /// <summary> /// 注冊(cè)時(shí)間 /// </summary> public DateTime? RegTime { get; set; } /// <summary> /// 上次登錄時(shí)間 /// </summary> public DateTime? LastLoginTime { get; set; } /// <summary> /// 用戶(hù)組 /// </summary> public virtual UserGroup Group { get; set; } }
下面添加用戶(hù)Controller。在Controller文件夾點(diǎn)右鍵 選擇新建控制器名稱(chēng)輸入U(xiǎn)serController,完成后生成代碼如下:
using System.Web.Mvc; using CMS.Models; namespace CMS.Controllers { public class UserController : Controller { public ActionResult Register() { return View(); } // // POST: /User/Create [HttpPost] public ActionResult Register(UserRegister uerReg) { try { // TODO: Add insert logic here return RedirectToAction("Index"); } catch { return View(); } } } }
馬上涉及的問(wèn)題就是數(shù)據(jù)的存取,本來(lái)準(zhǔn)備用Repository模式做,后來(lái)覺(jué)得用Repository模式在一個(gè)人寫(xiě)個(gè)簡(jiǎn)單那網(wǎng)站的情況下意義不大,寫(xiě)起來(lái)反而有點(diǎn)啰嗦,干脆用偽Repository模式寫(xiě)。項(xiàng)目中新建Repository文件夾。在文件夾中新建類(lèi)CMS,用來(lái)實(shí)現(xiàn)EF的Context。代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.Entity; using CMS.Models; namespace CMS.Repository { public class CMSContext:DbContext { public DbSet<User> Users { get; set; } } }
簡(jiǎn)單吧。再建一個(gè)類(lèi)RepositoryBase,用來(lái)做***Repository的基類(lèi),里面寫(xiě)Add,Update,Delete,Find幾個(gè)虛函數(shù),方便在繼承類(lèi)里面這幾個(gè)函數(shù)的名稱(chēng)統(tǒng)一。
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace CMS.Repository { public class RepositoryBase<TModel> { private CMSContext dbContext; public RepositoryBase() { dbContext = new CMSContext(); } /// <summary> /// 添加【繼承類(lèi)重寫(xiě)后才能正常使用】 /// </summary> public virtual bool Add(TModel Tmodel) { return false; } /// <summary> /// 更新【繼承類(lèi)重寫(xiě)后才能正常使用】 /// </summary> public virtual bool Update(TModel Tmodel) { return false; } /// <summary> /// 刪除【繼承類(lèi)重寫(xiě)后才能正常使用】 /// </summary> public virtual bool Delete(int Id) { return false; } /// <summary> /// 查找指定值【繼承類(lèi)重寫(xiě)后才能正常使用】 /// </summary> public virtual TModel Find(int Id) { return default(TModel); } ~RepositoryBase() { if (dbContext != null) { dbContext.Dispose(); } } } }
可以寫(xiě)UserRepository的具體實(shí)現(xiàn)了,新建UserRepository類(lèi)。重寫(xiě)Add,Update方法后代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using CMS.Models; namespace CMS.Repository { public class UserRepository:RepositoryBase<User> { private CMSContext dbContext; public UserRepository() { dbContext = new CMSContext(); } /// <summary> /// 添加用戶(hù) /// </summary> /// <param name="user">用戶(hù)信息</param> /// <returns></returns> public override bool Add(User user) { if (user == null) return false; dbContext.Users.Add(user); if (dbContext.SaveChanges() > 0) return true; else return false; } /// <summary> /// 更新用戶(hù)信息 /// </summary> /// <param name="user"></param> /// <returns></returns> public override bool Update(User user) { var _user = dbContext.Users.SingleOrDefault(u => u.UserId == user.UserId); if (_user == null) return false; _user = user; if (dbContext.SaveChanges() > 0) return true; else return false; } //public override } }
到這里Repository的基本模式也出來(lái)了,現(xiàn)在MVC中的M和C都出來(lái)了就差V了,少了V相當(dāng)于高富帥少了“富”在高,再帥都沒(méi)用。那么馬上下手為了寫(xiě)view做準(zhǔn)備。
@Html.Label可以用來(lái)顯示字段的Display(Name=“”),@Html.DisplayText顯示模型中字段值。沒(méi)有找到用來(lái)顯示模型中字段的Display(……,Description=“”)屬性的HtmlHelper。先自己寫(xiě)一個(gè)用。在項(xiàng)目中新建Extensions文件夾,右鍵添加類(lèi)DisplayDescriptionExtensions,在生成的代碼中將命名空間改為System.Web.Mvc.Html,添加兩個(gè)靜態(tài)方法DisplayDescription和DisplayDescriptionFor。完成后代碼 :
using System.Linq.Expressions; namespace System.Web.Mvc.Html { public static class DisplayDescriptionExtensions { /// <summary> /// 模型描述信息 /// </summary> /// <param name="htmlHelper"></param> /// <param name="name"></param> /// <returns></returns> public static MvcHtmlString DisplayDescription(this HtmlHelper htmlHelper, string name) { ModelMetadata _modelMetadata = ModelMetadata.FromStringExpression(name, htmlHelper.ViewData); return MvcHtmlString.Create(_modelMetadata.Description); } /// <summary> /// 模型描述信息 /// </summary> /// <typeparam name="TModel"></typeparam> /// <typeparam name="TResult"></typeparam> /// <param name="htmlHelper"></param> /// <param name="expression"></param> /// <returns></returns> public static MvcHtmlString DisplayDescriptionFor<TModel, TResult>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TResult>> expression) { ModelMetadata _modelMetadata = ModelMetadata.FromLambdaExpression(expression,htmlHelper.ViewData); return MvcHtmlString.Create(_modelMetadata.Description); } } }
好了,在視圖中就可以直接用@Html.DisplayDescriptionFor(model => model.UserName)或@Html.DisplayDescription(“.UserName”)調(diào)用描述信息了.
到了這里后,大致的準(zhǔn)備工作差不多了,還有兩個(gè)小東東實(shí)現(xiàn)一下就可以寫(xiě)具體功能了。
第一個(gè)小東東:驗(yàn)證碼。驗(yàn)證碼分兩塊一是隨機(jī)獲取一定位數(shù)的字符,另一塊是把字符繪制成圖片。
在項(xiàng)目中添加Common 文件夾,在文件夾中新建Text類(lèi),在類(lèi)實(shí)現(xiàn)函數(shù)VerificationText()利用Random獲取指定長(zhǎng)度的隨機(jī)字符串,寫(xiě)完后的代碼:
using System; namespace CMS.Common { /// <summary> /// 文本相關(guān) /// </summary> public class Text { /// <summary> /// 獲取驗(yàn)證碼【字符串】 /// </summary> /// <param name="Length">驗(yàn)證碼長(zhǎng)度【必須大于0】</param> /// <returns></returns> public static string VerificationText(int Length) { char[] _verification = new Char[Length]; Random _random = new Random(); char[] _dictionary = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; for (int i = 0; i < Length; i++) { _verification[i] = _dictionary[_random.Next(_dictionary.Length - 1)]; } return new string(_verification); } } }
現(xiàn)在可以繪制驗(yàn)證碼了,這里會(huì)用到.net的GDI+,我看了很多朋友寫(xiě)的驗(yàn)證碼,一般都繪制了很多干擾點(diǎn)和干擾線,目的是為了使驗(yàn)證碼不容易被電腦,個(gè)人覺(jué)得把繪制字的時(shí)候用材質(zhì)刷繪制應(yīng)該也能達(dá)到目的,所以找了一幅水彩畫(huà)的材質(zhì)。
用這個(gè)做字的材質(zhì)也應(yīng)該不太容易別識(shí)別吧,開(kāi)始寫(xiě)繪圖的代碼,在UserController里新建名為VerificationCode的Action,代碼如下:
/// <summary> /// 繪制驗(yàn)證碼 /// </summary> /// <returns></returns> public ActionResult VerificationCode() { int _verificationLength = 6; int _width = 100, _height = 20; SizeF _verificationTextSize; Bitmap _bitmap = new Bitmap(Server.MapPath("~/Skins/Common/Texture.jpg"),true); TextureBrush _brush = new TextureBrush(_bitmap); //獲取驗(yàn)證碼 string _verificationText = Common.Text.VerificationText(_verificationLength); //存儲(chǔ)驗(yàn)證碼 Session["VerificationCode"] = _verificationText.ToUpper(); Font _font = new Font("Arial", 14, FontStyle.Bold); Bitmap _image = new Bitmap(_width, _height); Graphics _g = Graphics.FromImage(_image); //清空背景色 _g.Clear(Color.White); //繪制驗(yàn)證碼 _verificationTextSize = _g.MeasureString(_verificationText, _font); _g.DrawString(_verificationText,_font,_brush,(_width-_verificationTextSize.Width)/2,(_height-_verificationTextSize.Height)/2); _image.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); return null; }
打開(kāi)瀏覽器看下效果還不錯(cuò)。到此準(zhǔn)備工作完成。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- ASP.NET?MVC5網(wǎng)站開(kāi)發(fā)用戶(hù)登錄、注銷(xiāo)(五)
- ASP.NET?MVC5網(wǎng)站開(kāi)發(fā)用戶(hù)注冊(cè)(四)
- ASP.NET?MVC5?網(wǎng)站開(kāi)發(fā)框架模型、數(shù)據(jù)存儲(chǔ)、業(yè)務(wù)邏輯(三)
- ASP.NET?MVC5網(wǎng)站開(kāi)發(fā)顯示文章列表(九)
- ASP.NET MVC5網(wǎng)站開(kāi)發(fā)管理列表、回復(fù)及刪除(十三)
- ASP.NET MVC5網(wǎng)站開(kāi)發(fā)文章管理架構(gòu)(七)
- ASP.NET?MVC5網(wǎng)站開(kāi)發(fā)咨詢(xún)管理的架構(gòu)(十一)
- ASP.NET MVC5網(wǎng)站開(kāi)發(fā)之展示層架構(gòu)(五)
- ASP.NET?MVC5網(wǎng)站開(kāi)發(fā)之用戶(hù)添加和瀏覽2(七)
- ASP.NET?MVC5網(wǎng)站開(kāi)發(fā)之總體概述(一)
相關(guān)文章
ASP.NET Core3.1 Ocelot認(rèn)證的實(shí)現(xiàn)
這篇文章主要介紹了ASP.NET Core3.1 Ocelot認(rèn)證的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Ajax實(shí)現(xiàn)評(píng)論中頂和踩功能的實(shí)例代碼
這算是社團(tuán)布置的一個(gè)假期小作業(yè)吧,我只是提出我自己的解決方案,不一定是最合適的。2013-04-04Json日期格式問(wèn)題的四種解決方法(超詳細(xì))
這篇文章主要介紹了Json日期格式問(wèn)題的四種解決方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03Asp.net中把Excel數(shù)據(jù)存儲(chǔ)至SQL Server中的具體實(shí)現(xiàn)方法
Asp.net中把Excel數(shù)據(jù)存儲(chǔ)至SQL Server中的具體實(shí)現(xiàn)方法,需要的朋友可以參考一下2013-06-06C#精髓 GridView72大絕技 學(xué)習(xí)gridview的朋友必看
C#精髓 GridView72大絕技 學(xué)習(xí)gridview的朋友可以參考下。2009-10-10.net SMTP發(fā)送Email實(shí)例(可帶附件)
本文為大家詳細(xì)介紹下.net SMTP發(fā)送Email同時(shí)可帶附件的具體實(shí)現(xiàn)思路及代碼,想實(shí)現(xiàn)的朋友可以參考下哈,希望對(duì)大家有所幫助2013-07-07ASP.NET Page函數(shù)調(diào)用順序解析
asp.net頁(yè)面事件執(zhí)行順序,需要的朋友可以參考下。2010-06-06