2010-02-19 2 views
0

Я являюсь частью пути реализации собственного приложения CAPTCHA (т. Е. Не reCaptcha) в своем приложении. Я построил его по строкам книги Сандерсона, Pro ASP.NET MVC Framework. Он построен в класс HtmlHelper, так что я могу назвать это, на мой взгляд, какASP.NET MVC - Как визуализировать метод HtmlHelper в контроллере?

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

Однако, чтобы использовать это я нужен способ, чтобы позволить это повторно поколение. Если вы не можете прочитать это, нажмите [здесь].

Это [здесь] Я хочу быть управляющим действием, которое генерирует изображение captcha и возвращает обратно html. (Я буду использовать это в ссылке Ajax.ActionLink.)

Но мне трудно понять, как это сделать в моем контроллере. Как я могу получить ручку на HtmlHelper, что требуется по 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()); 
    } 
} 

Мой 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

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

ответ

2

Вам не нужно создавать html-помощники в вашем контроллере. Вы должны создать частичный вид, возвращающий капчу и вернуть PartialViewResult:

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

Согласен. Это всегда то, что лучше всего оставить PartialView, а не то, что вы визуализировали в методе контроллера. Отделите презентацию и оставьте ее в представлении. –

+0

Awesome. Работает как шарм! Благодаря! – Scott

0

@LukLed является правильным. PartialView более подходит для этого, также вы можете посмотреть на this.

Смежные вопросы