0

0

asp.net 图片验证码的HtmlHelper

高洛峰

高洛峰

发布时间:2017-01-13 14:04:05

|

1471人浏览过

|

来源于php中文网

原创

一个图片验证码的htmlhelper,原来的调用代码如下: 

asp.net 图片验证码的HtmlHelper 

封装成HtmlHelper后: 
@Html.ValidateCode() 
使用步骤如下: 
1.建一个验证码Helper 

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System; 
using System.Collections.Generic; 
using System.Diagnostics.CodeAnalysis; 
using System.Globalization; 
using System.Linq.Expressions; 
using System.Security.Policy; 
using System.Text; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Mvc.Resources; 
using System.Web.Routing; 
namespace MvcApplication1 
{ 
public static class ValidateCodeHelper 
{ 
private const string IdPrefix = "validateCode"; 
private const int Length = 4; 
public static MvcHtmlString ValidateCode(this HtmlHelper helper) 
{ 
return ValidateCode(helper, IdPrefix); 
} 
public static MvcHtmlString ValidateCode(this HtmlHelper helper,string id) 
{ 
return ValidateCode(helper, id, Length); 
} 
public static MvcHtmlString ValidateCode(this HtmlHelper helper, string id, int length) 
{ 
return ValidateCode(helper, id, length, null); 
} 
public static MvcHtmlString ValidateCode(this HtmlHelper helper, string id, object htmlAttributes) 
{ 
return ValidateCode(helper, id, Length, htmlAttributes); 
} 
public static MvcHtmlString ValidateCode(this HtmlHelper helper, int length, object htmlAttributes) 
{ 
return ValidateCode(helper, IdPrefix, length, htmlAttributes); 
} 
public static MvcHtmlString ValidateCode(this HtmlHelper helper, object htmlAttributes) 
{ 
return ValidateCode(helper, 4, htmlAttributes); 
} 
public static MvcHtmlString ValidateCode(this HtmlHelper helper, int length) 
{ 
return ValidateCode(helper,length, null); 
} 
public static MvcHtmlString ValidateCode(this HtmlHelper helper,string id,int length,object htmlAttributes) 
{ 
string finalId = id + "_imgValidateCode"; 
var tagBuild = new TagBuilder("img"); 
tagBuild.GenerateId(finalId); 
var defaultController = ((Route)RouteTable.Routes["Default"]).Defaults["controller"] + "/"; 
var controller = HttpContext.Current.Request.Url.Segments.Length == 1 
? defaultController 
: HttpContext.Current.Request.Url.Segments[1]; 
tagBuild.MergeAttribute("src", string.Format("/{0}GetValidateCode?length={1}",controller,length)); 
tagBuild.MergeAttribute("alt", "看不清?点我试试看!"); 
tagBuild.MergeAttribute("style","cursor:pointer;"); 
tagBuild.MergeAttributes(AnonymousObjectToHtmlAttributes(htmlAttributes)); 
var sb = new StringBuilder(); 
sb.Append(""); 
return MvcHtmlString.Create(tagBuild+sb.ToString()); 
} 
public static RouteValueDictionary AnonymousObjectToHtmlAttributes(object htmlAttributes) 
{ 
var result = new RouteValueDictionary(); 
if (htmlAttributes != null) 
{ 
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(htmlAttributes)) 
{ 
result.Add(property.Name.Replace('_', '-'), property.GetValue(htmlAttributes)); 
} 
} 
return result; 
} 
} 
}

2.生成验证码的代码: 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Drawing; 
using System.Drawing.Drawing2D; 
using System.IO; 
using System.Drawing.Imaging; 
namespace MvcApplication1 
{ 
public class ValidateCode 
{ 
public ValidateCode() 
{ 
} 
///  
/// 验证码的最大长度 
///  
public int MaxLength 
{ 
get { return 10; } 
} 
///  
/// 验证码的最小长度 
///  
public int MinLength 
{ 
get { return 1; } 
} 
///  
/// 生成验证码 
///  
/// 指定验证码的长度 
///  
public string CreateValidateCode(int length) 
{ 
var randMembers = new int[length]; 
var validateNums = new int[length]; 
var validateNumberStr = ""; 
//生成起始序列值 
var seekSeek = unchecked((int)DateTime.Now.Ticks); 
var seekRand = new Random(seekSeek); 
var beginSeek = (int)seekRand.Next(0, Int32.MaxValue - length * 10000); 
var seeks = new int[length]; 
for (var i = 0; i < length; i++) 
{ 
beginSeek += 10000; 
seeks[i] = beginSeek; 
} 
//生成随机数字 
for (var i = 0; i < length; i++) 
{ 
var rand = new Random(seeks[i]); 
var pownum = 1 * (int)Math.Pow(10, length); 
randMembers[i] = rand.Next(pownum, Int32.MaxValue); 
} 
//抽取随机数字 
for (var i = 0; i < length; i++) 
{ 
var numStr = randMembers[i].ToString(); 
var numLength = numStr.Length; 
var rand = new Random(); 
var numPosition = rand.Next(0, numLength - 1); 
validateNums[i] = Int32.Parse(numStr.Substring(numPosition, 1)); 
} 
//生成验证码 
for (var i = 0; i < length; i++) 
{ 
validateNumberStr += validateNums[i].ToString(); 
} 
return validateNumberStr; 
} 
///  
/// 创建验证码的图片 
///  
/// 验证码 
public byte[] CreateValidateGraphic(string validateCode) 
{ 
var image = new Bitmap((int)Math.Ceiling(validateCode.Length * 12.0), 22); 
var g = Graphics.FromImage(image); 
try 
{ 
//生成随机生成器 
var random = new Random(); 
//清空图片背景色 
g.Clear(Color.White); 
//画图片的干扰线 
for (int i = 0; i < 25; i++) 
{ 
var x1 = random.Next(image.Width); 
var x2 = random.Next(image.Width); 
var y1 = random.Next(image.Height); 
var y2 = random.Next(image.Height); 
g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2); 
} 
//Font font = new Font("Arial", 12, (FontStyle.Bold | FontStyle.Italic)); 
string[] fontName = { "华文新魏", "宋体", "圆体", "黑体", "隶书" }; 
var font = new Font(fontName[new Random().Next(0, validateCode.Length)], 12, (FontStyle.Bold | FontStyle.Italic)); 
var 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 (var i = 0; i < 100; i++) 
{ 
var x = random.Next(image.Width); 
var 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); 
//保存图片数据 
var stream = new MemoryStream(); 
image.Save(stream, ImageFormat.Jpeg); 
//输出图片流 
return stream.ToArray(); 
} 
finally 
{ 
g.Dispose(); 
image.Dispose(); 
} 
} 
///  
/// 得到验证码图片的长度 
///  
/// 验证码的长度 
///  
public static int GetImageWidth(int validateNumLength) 
{ 
return (int)(validateNumLength * 12.0); 
} 
///  
/// 得到验证码的高度 
///  
///  
public static double GetImageHeight() 
{ 
return 23; 
} 
} 
}

3.建一个BaseController 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
namespace MvcApplication1 
{ 
public class BaseController:Controller 
{ 
public ActionResult GetValidateCode(int length) 
{ 
var vCode = new ValidateCode(); 
var code = vCode.CreateValidateCode(length); 
Session["ValidateCode"] = code; 
var bytes = vCode.CreateValidateGraphic(code); 
return File(bytes, @"image/gif"); 
} 
protected string GetValidateCode() 
{ 
return Session["ValidateCode"].ToString(); 
} 
} 
}

4.让Controller继承BaseController: 

立即学习前端免费学习笔记(深入)”;

canvas随机生成图片验证码
canvas随机生成图片验证码

canvas随机生成图片验证码

下载
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Security; 
namespace MvcApplication1.Controllers 
{ 
public class HomeController :BaseController 
{ 
public ActionResult Index() 
{ 
ViewBag.Message = "Welcome to ASP.NET MVC!"; 
return View(); 
} 
public ActionResult About() 
{ 
var code = GetValidateCode(); 
return View(); 
} 
} 
}

5.页面调用代码: 

@using MvcApplication1 
@{ 
ViewBag.Title = "About Us"; 
} 

About

Put content here.

@Html.ValidateCode()

6.验证码的效果图:

asp.net 图片验证码的HtmlHelper

更多asp.net 图片验证码的HtmlHelper相关文章请关注PHP中文网!

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号