使用jquery刷新验证码图像

时间:2014-05-27 09:21:22

标签: c# javascript jquery asp.net-mvc captcha

我在剃刀页面上有一个HTML图像标记。此图显示了生成的验证码。我添加了一些jquery来点击它时刷新这个图像。这可以在我的电脑上运行,但是当我将它发布到服务器时,单击图像时没有任何反应。

<img id="captcha-image" src="@Url.Action("Captcha", "Home")" />
...
$("#captcha-image").click(function () {
    this.src = "@Url.Action("Captcha", "Home")";
});

修改
我已经确定这是因为图像可能是由浏览器缓存的。现在我想在GET请求中发送一个随机数,这样浏览器缓存不会否定我的努力。

现在的问题是如何在适当的地方获取随机数:

$("#captcha-image").click(function () {
    this.src = "@Url.Action("Captcha", "Home", new { r = System.Random.Next() })";
});

这不起作用,因为Next()不是System.Random中的静态方法,我需要引用Random对象才能使用它。

我也尝试过使用JavaScript随机方法:

$("#captcha-image").click(function () {
    var randomNumber = Math.floor(Math.random());
    this.src = "@Url.Action("Captcha", "Home", new { r = randomNumber})";
});

此处的问题是变量randomNumber@Url.Action的c#代码块范围内不可见。

2 个答案:

答案 0 :(得分:1)

您可以使用replace来更改randomNumber字符串及其值,也可以将外部双引号更改为single并将randomNumber传递给匿名对象初始值设定项。

this.src = '@Url.Action("Captcha", "Home", new { randomNumber = "_randomNumber_"})'.replace("_randomNumber_", randomNumber );

其他方式可能是使用javascript连接服务器端代码以生成查询字符串

this.src = '@Url.Action("Captcha", "Home")?randomNumber' + randomNumber ;

答案 1 :(得分:0)

//Put This one Partial view

<img src="@Url.Action("GetCaptchaImage", "Vulpith_Public",new { dt=@DateTime.Now},Request.Url.Scheme)" />


     //And call ajax from this partial view as following

function Captcharefresh() {
$.ajax({
             url: "../Vulpith_Public/_GetCaptcha",
             type: "post",
             dataType: "html",
             data: {},
success: function (data) {
    $('#codeRefresh').html(data)
},
error: function (data) {
}
});
}


//and create actions as following

public FileResult GetCaptchaImage(DateTime dt)
{
    CaptchaRandomImage CI = new CaptchaRandomImage();
    this.Session["CaptchaImageText"] = CI.GetRandomString(5); // here 5 means I want to get 5 char long captcha
    //CI.GenerateImage(this.Session["CaptchaImageText"].ToString(), 300, 75);
    // Or We can use another one for get custom color Captcha Image 
    CI.GenerateImage(this.Session["CaptchaImageText"].ToString(), 300, 75, Color.DarkGray, Color.White);
    MemoryStream stream = new MemoryStream();
    CI.Image.Save(stream, ImageFormat.Png);
    stream.Seek(0, SeekOrigin.Begin);
    return new FileStreamResult(stream, "image/png");
}


//One more action as
[HttpPost]
public ActionResult _GetCaptcha()
{
    return PartialView();
}