我是在我的应用程序中实现本机CAPTCHA(即不是reCaptcha)解决方案的一部分。我按照Sanderson的书Pro ASP.NET MVC Framework的说法构建了它。它内置于HtmlHelper类中,因此我可以在我的视图中调用它,如
<%= Html.Captcha("nameOfGeneratedCaptchaIdField")%>
然而,要使用它,我需要一种方法来允许它重新生成。即如果您无法阅读此内容,请单击[此处]。
这[这里]我想成为一个控制器动作,生成验证码图像并吐出html。 (我将在Ajax.ActionLink链接中使用它。)
但我无法弄清楚如何在我的控制器中执行此操作。如何处理HtmlHelper
所需的HtmlHelperpublic ActionResult RegenerateCaptcha(string name)
{
var myHtmlHelper = ???;
var newCaptcha = Captcha.Helpers.CaptchaHelper.Captcha(myHtmlHelper, name);
if (Request.IsAjaxRequest())
{
return Content(newCaptcha.ToString());
}
else
{
return Content(newCaptcha.ToString());
}
}
我的Captcha Helper编码为:
// this is invoked in a view by <%= Html.Captcha("myCaptcha") %>
public static string Captcha(this HtmlHelper html, string name)
{
// Pick a GUID to represent this challenge
string challengeGuid = Guid.NewGuid().ToString();
// Generate and store a random solution text
var session = html.ViewContext.HttpContext.Session;
session[SessionKeyPrefix + challengeGuid] = MakeRandomSolution();
// Render an <IMG> tag for the distorted text,
var urlHelper = new UrlHelper(html.ViewContext.RequestContext);
string url = urlHelper.Action("Render", "CaptchaImage", new{challengeGuid});
// fill it with a newly rendered image url,
// plus a hidden field to contain the challenge GUID
return string.Format(ImgFormat, name, challengeGuid, url);
}
我想我可以将其复制出Helper并将其粘贴到我的控制器动作中,但这似乎有点无聊......
感谢。
答案 0 :(得分:2)
您不必在控制器中创建html助手。您应该创建部分视图返回验证码并返回PartialViewResult:
public PartialViewResult Captcha()
{
return PartialView("Captcha");
}
答案 1 :(得分:0)
@LukLed是对的。 PartialView更适合这种情况,您也可以查看this。