Simple Captcha In MVC :
In Model:
In Controller:
Name Spaces in controller:
In Model:
public class SubscribeModel
{
//model
specific fields
[Required]
[Display(Name = "How much is
the sum")]
public string Captcha { get; set; }
}
In Controller:
Name Spaces in controller:
using System.Drawing;
using System.IO;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using JQGridExample.Models;
public ActionResult Index()
{
return View();
}
public ActionResult CaptchaImage(string prefix, bool noisy = true)
{
var rand = new Random((int)DateTime.Now.Ticks);
//generate
new question
int a = rand.Next(10, 99);
int b = rand.Next(0, 9);
var captcha = string.Format("{0} + {1} =
?", a, b);
//store
answer
Session["Captcha" +
prefix] = a + b;
//image
stream
FileContentResult img = null;
using (var mem = new MemoryStream())
using (var bmp = new Bitmap(130, 30))
using (var gfx = Graphics.FromImage((Image)bmp))
{
gfx.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
gfx.SmoothingMode = SmoothingMode.AntiAlias;
gfx.FillRectangle(Brushes.White, new Rectangle(0, 0, bmp.Width,
bmp.Height));
//add
noise
if (noisy)
{
int i, r, x, y;
var pen = new Pen(Color.Yellow);
for (i = 1; i < 10; i++)
{
pen.Color = Color.FromArgb(
(rand.Next(0, 255)),
(rand.Next(0, 255)),
(rand.Next(0, 255)));
r = rand.Next(0, (130 /
3));
x = rand.Next(0, 130);
y = rand.Next(0, 30);
gfx.DrawEllipse(pen,x-r, y-r,r,r);
}
}
//add
question
gfx.DrawString(captcha, new Font("Tahoma", 15), Brushes.Gray, 2, 3);
//render
as Jpeg
bmp.Save(mem,
System.Drawing.Imaging.ImageFormat.Jpeg);
img = this.File(mem.GetBuffer(), "image/Jpeg");
}
return img;
}
[HttpPost]
public ActionResult Index(SubscribeModel model)
{
//validate
captcha
if (Session["Captcha"] == null || Session["Captcha"].ToString() != model.Captcha)
{
ModelState.AddModelError("Captcha", "Wrong value of sum, please try again.");
//dispay
error and generate a new captcha
return View(model);
}
return View("ThankYouPage");
}
public ActionResult ThankYouPage()
{
return View();
}
In View:
@model
JQGridExample.Models.SubscribeModel
@{
ViewBag.Title = "CaptchaImage";
}
<h2>CaptchaImage</h2>
@using(Html.BeginForm()){
<table>
<tr>
<td> @Html.LabelFor(model => model.Captcha)
<a href="@Url.Action("Index","Add")">
<img alt="Captcha" src="@Url.Action("CaptchaImage")" style="" />
</a> </td>
<td> @Html.TextBoxFor(model => model.Captcha)
@Html.ValidationMessageFor(model => model.Captcha) </td>
</tr>
<tr><td><input type="submit" value="submit" /></td</tr>
</table>
}
No comments:
Post a Comment