• 技术文章 >后端开发 >C#.Net教程

    asp.net 图片验证码的HtmlHelper

    高洛峰高洛峰2017-01-13 14:04:05原创407
    一个图片验证码的HtmlHelper,原来的调用代码如下:

    <img id="validateCode" mailto:src='@Url.Action(%22GetValidateCode%22)'/> 
    <script language="javascript" type="text/javascript"> 
    $(document).ready(function () { 
    $("#validateCode").bind("click", function () { 
    var url = $(this).attr("src"); 
    url += "?" + Math.random(); 
    $(this).attr("src", url); 
    }); 
    }); 
    </script>

    封装成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("<script language=\"javascript\" type=\"text/javascript\">"); 
    sb.Append("$(document).ready(function () {"); 
    sb.AppendFormat("$(\"#{0}\").bind(\"click\", function () {{", finalId); 
    //sb.Append("$(this).attr(\"style\", \"cursor:pointer;\");"); 
    sb.Append("var url = $(this).attr(\"src\");"); 
    sb.Append("url += \"&\" + Math.random();"); 
    sb.Append("$(this).attr(\"src\", url);"); 
    sb.Append("});"); 
    sb.Append("});"); 
    sb.Append("</script>"); 
    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() 
    { 
    } 
    /// <summary> 
    /// 验证码的最大长度 
    /// </summary> 
    public int MaxLength 
    { 
    get { return 10; } 
    } 
    /// <summary> 
    /// 验证码的最小长度 
    /// </summary> 
    public int MinLength 
    { 
    get { return 1; } 
    } 
    /// <summary> 
    /// 生成验证码 
    /// </summary> 
    /// <param name="length">指定验证码的长度</param> 
    /// <returns></returns> 
    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; 
    } 
    /// <summary> 
    /// 创建验证码的图片 
    /// </summary> 
    /// <param name="validateCode">验证码</param> 
    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(); 
    } 
    } 
    /// <summary> 
    /// 得到验证码图片的长度 
    /// </summary> 
    /// <param name="validateNumLength">验证码的长度</param> 
    /// <returns></returns> 
    public static int GetImageWidth(int validateNumLength) 
    { 
    return (int)(validateNumLength * 12.0); 
    } 
    /// <summary> 
    /// 得到验证码的高度 
    /// </summary> 
    /// <returns></returns> 
    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:

    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"; 
    } 
    <h2>About</h2> 
    <p> 
    Put content here. 
    </p> 
    @Html.ValidateCode()

    6.验证码的效果图:

    asp.net 图片验证码的HtmlHelper

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

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:asp.net 验证码生成和刷新及验证 下一篇:asp.net mvc验证码类使用
    PHP编程就业班

    相关文章推荐

    • c语言中形参的缺省存储类别是什么• SUNWEN教程之----C#进阶(五)• C++设计模式浅识装饰模式• 利用c#制作简单的留言板(2)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网