1.public
class
SubscribeModel
2.{
3. //model specific
fields
4. [Required]
5. [Display(Name
= "Quanto é o resultado desse somatório")]
6. public
string
Captcha { get;
set; }
Então no controller, eu indico o user controller pra maioria dos casos que se usa captcha, ou seja o momento que se testa usuário, login, senha... ...nós montamos o controller do captcha:
using
System.Drawing;
using
System.IO;
using
System.Drawing.Drawing2D;
using
System.Drawing.Text;
public
ActionResult CaptchaImage(string
prefix, bool
noisy = true)
{
var rand =
new
Random((int)DateTime.Now.Ticks);
//gera uma nova questão
int
a = rand.Next(10, 99);
int
b = rand.Next(0, 9);
var captcha =
string.Format("{0} + {1} = ?", a, b);
//guarda a resposta na session
Session["Captcha"
+ prefix] = a + b;
//faz stream da imagem
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));
//adiciona ruído
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);
}
}
//adiciona a questão
gfx.DrawString(captcha,
new
Font("Tahoma", 15), Brushes.Gray, 2, 3);
//renderiza o Jpeg
bmp.Save(mem, System.Drawing.Imaging.ImageFormat.Jpeg);
img =
>new
Font("Tahoma", 15), Brushes.Gray, 2, 3);
this.File(mem.GetBuffer(),
"image/Jpeg");
}
return
img;
Então agora construímos a view usando razor ela fica da seguinte forma:
02.@*form specific fields*@
03.<div
class="editor-label">
04. @Html.LabelFor(model
=> model.Captcha)
05. <a
href="@Url.Action("Index")">
06. <img
alt="Captcha"
src="@Url.Action("CaptchaImage")"
style=""
/>
07. </a>
08.</div>
09.<div
class="editor-field">
10. @Html.EditorFor(model
=> model.Captcha)
11. @Html.ValidationMessageFor(model
=> model.Captcha)
12.</div>
Finalmente temos de fazer o teste do resultado, novamente no controller:
01.[HttpPost]
02.public
ActionResult Index(SubscribeModel model)
03.{
04. //validação
do captcha
05. if
(Session["Captcha"] ==
null
|| Session["Captcha"].ToString() != model.Captcha)
06. {
07. &nbs-right:0.3em;text-align:right;display:block;">05. if
(Session["Captcha"] ==
null ModelState.AddModelError("Captcha",
Resultado errado, por favor tente novamente.");
08. //Mostra
mensagem de erro e gra novo captcha
09. return
View(model);
10. }
11. return
RedirectToAction("páginaderesposta");
12.}
Finalmente você tem seu captcha, que aqui pode-se fazer outras contas aleatórias, mexer no tamanho da imagem gerada e do seu rúido, assim como entender o caminho que toda a transação passa gravando em sessão, model, controler e views.
Abraço