辅助方法类:
/// <summary>/// 验证码图片/// </summary>/// <returns></returns>public ActionResult SecurityCode(){string oldcode = TempData["SecurityCode"] as string;string code = CreateRandomCode(5);TempData["SecurityCode"] = code;return File(CreateValidateGraphic(code), "Image/Jpeg");}/// <summary>/// 生成随机的字符串/// </summary>/// <param name="codeCount">字符串数量</param>/// <returns></returns>public string CreateRandomCode(int codeCount){string allChar = "1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z";string[] allCharArray = allChar.Split(',');string randomCode = "";int temp = -1;Random rand = new Random();for (int i = 0; i < codeCount; i++){if (temp != -1){rand = new Random(i * temp * ((int)DateTime.Now.Ticks));}int t = rand.Next(35);if (temp == t){return CreateRandomCode(codeCount);}temp = t;randomCode += allCharArray[t];}return randomCode;}/// <summary>/// 生成验证码图片/// </summary>/// <param name="validateCode"></param>/// <returns></returns>public byte[] CreateValidateGraphic(string validateCode){Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 16.0), 27);Graphics g = Graphics.FromImage(image);try{//生成随机生成器Random random = new Random();//清空图片背景颜色g.Clear(Color.White);//图片中的干扰线for (int i = 0; i < 25; i++){int x1 = random.Next(image.Width);int x2 = random.Next(image.Width);int y1 = random.Next(image.Height);int y2 = random.Next(image.Height);g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);}Font font = new Font("Arial", 13, (FontStyle.Bold | FontStyle.Italic));LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);g.DrawString(validateCode, font, brush, 3, 2);//图片中的前景干扰点for (int i = 0; i < 100; i++){int x = random.Next(image.Width);int y = random.Next(image.Height);image.SetPixel(x, y, Color.FromArgb(random.Next()));}//图片中的边框g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);//保存图片数据MemoryStream stream = new MemoryStream();image.Save(stream, ImageFormat.Jpeg);//输出图片流return stream.ToArray();}finally{g.Dispose();image.Dispose();}}
调用辅助方法类并验证:
if (pare(TempData["SecurityCode"].ToString(), regUser.SecurityCode, true) != 0){ModelState.AddModelError("SecurityCode", "验证码不正确!");return View(regUser);}
前端代码:
<dt>验证码</dt><dd>@Html.TextBoxFor(m => m.SecurityCode, new { @class = "textInputSmall" })@Html.ValidationMessageFor(model => model.SecurityCode)<p><img alt="验证码图片" id="ImgValidateCode" title="看不清?点击换一个" src="@Url.Action("SecurityCode")" onclick="this.src=this.src+'?'" /><br /><a href="#" onclick="document.getElementById('ImgValidateCode').src=document.getElementById('ImgValidateCode').src+'?'">看不清换一张</a><br /></p></dd>