一个图片验证码的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。