2010-02-19 10 views
0

Je suis en train de mettre en œuvre une solution native CAPTCHA (c'est-à-dire non reCaptcha) dans mon application. Je l'ai construit sur le modèle du livre de Sanderson, Pro ASP.NET MVC Framework. Il est construit dans une classe HtmlHelper pour que je puisse l'appeler à mon avis commeASP.NET MVC - Comment rendre une méthode HtmlHelper dans un contrôleur?

<%= Html.Captcha("nameOfGeneratedCaptchaIdField")%> 

Cependant, pour utiliser cela, je vais avoir besoin d'un moyen de permettre cela re-génération. Si vous ne pouvez pas lire ceci, cliquez sur [ici].

Ceci [ici] Je veux être une action de contrôleur qui génère l'image de captcha et crache le html. (Je vais utiliser ceci dans un lien Ajax.ActionLink.)

Mais j'ai du mal à trouver comment faire cela dans mon contrôleur. Comment puis-je obtenir une poignée sur le HtmlHelper qui est requis par un HtmlHelper

public 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()); 
    } 
} 

Mon Captcha Helper est codé comme:

// 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); 
} 

Je suppose que je peux copier que de l'aide et le coller dans mon action de contrôleur, mais cela semble un peu ghetto ...

Merci.

+0

http://stackoverflow.com/questions/621235/using-htmlhelper-in-a-controller – womp

Répondre

2

Vous n'avez pas besoin de créer des aides html dans votre contrôleur. Vous devez créer une vue partielle retournant captcha et retourner PartialViewResult:

public PartialViewResult Captcha() 
{ 
    return PartialView("Captcha"); 
} 
+0

Je suis d'accord. C'est toujours quelque chose qu'il vaut mieux laisser à PartialView et non à quelque chose que vous voulez rendre dans une méthode de contrôleur. Séparez la présentation et laissez-la à une vue. –

+0

Génial. Fonctionne comme un charme! Merci! – Scott

0

@LukLed a raison. PartialView est plus approprié pour cela, vous pouvez également regarder this.

Questions connexes