ASP.NET MVC - 如何在控制器中呈现HtmlHelper方法?

时间:2010-02-19 21:42:04

标签: asp.net-mvc

我是在我的应用程序中实现本机CAPTCHA(即不是reCaptcha)解决方案的一部分。我按照Sanderson的书Pro ASP.NET MVC Framework的说法构建了它。它内置于HtmlHelper类中,因此我可以在我的视图中调用它,如

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

然而,要使用它,我需要一种方法来允许它重新生成。即如果您无法阅读此内容,请单击[此处]。

这[这里]我想成为一个控制器动作,生成验证码图像并吐出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并将其粘贴到我的控制器动作中,但这似乎有点无聊......

感谢。

2 个答案:

答案 0 :(得分:2)

您不必在控制器中创建html助手。您应该创建部分视图返回验证码并返回PartialViewResult:

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

答案 1 :(得分:0)

@LukLed是对的。 PartialView更适合这种情况,您也可以查看this