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