【问题标题】:Captcha nuget package always Valid on ASP.NET MVC 5Captcha nuget 包在 ASP.NET MVC 5 上始终有效
【发布时间】:2015-07-09 14:27:19
【问题描述】:

我已经安装了captcha plugin 并按照设置说明进行操作。验证码在页面上完美呈现,但在提交表单时,ModelState.IsValid 始终为真,无论我输入什么。显然,如果验证码无法验证,那对我来说就没什么好处了。

这是我的控制器:

        [HttpPost]
    [CaptchaValidation("CaptchaCode", "SampleCaptcha", "Incorrect CAPTCHA code!")]
    public ActionResult Register(AccountModel model)
    {
        if (!ModelState.IsValid)
        {
            // TODO: Captcha validation failed, show error message
        }
        else
        {
            // TODO: Captcha validation passed, proceed with protected action
        }

        return View();
    }

这是我的观点:

<link href="@BotDetect.Web.CaptchaUrls.Absolute.LayoutStyleSheetUrl" rel="stylesheet" type="text/css" />

<form class="form-horizointal" action="@Url.Action("Register", "Account")" method="POST">
    <div class="form-group">
        @Html.LabelFor(m => m.FirstName, new { @class = "col-sm-2 control-label" })
        @Html.TextBoxFor(m => m.FirstName, new { placeholder = "First Name"})
        @Html.LabelFor(m => m.LastName, new { @class = "control-label", placeholder = "Last Name" })
        @Html.TextBoxFor(m => m.LastName, new { placeholder = "Last Name" })
    </div>
    <div class="form-group">
        @Html.LabelFor(m => m.Email, new {@class = "col-sm-2 control-label", placeholder = "Email"})
        @Html.TextBoxFor(m => m.Email, new {placeholder = "Email"})
    </div>
    <div class="form-group">
        @{ MvcCaptcha sampleCaptcha = new MvcCaptcha("SampleCaptcha"); }
        @Html.Captcha(sampleCaptcha)
        @Html.TextBox("CaptchaCode")
    </div>
    <div class="form-group">
        captcha goes here
    </div>
    <div class="form-group">
        <input type="submit" class="btn btn-default" value="Register"/>
    </div>
</form>

有人知道为什么这对我不起作用吗?感谢您的帮助!

【问题讨论】:

  • 哪个验证码插件?其中之一使您的 VM 从库的模型继承变得势在必行(在这种情况下,这可能是问题 - MVC 不知道其他属性(y/ies)并且没有理由验证它)。 EDIT 从头开始​​,链接几乎是第一个单词。我想该睡觉了。
  • 更新:我已经做了一些事情,比如将验证码字段添加为模型属性,在最后一遍它神奇地开始工作。我不确定为什么。 :-/
  • 您是否完成了来自captcha.com/doc/aspnet/howto/asp.net-mvc-captcha.html 的其余部分指令,其中包括路由更改?

标签: c# asp.net-mvc captcha


【解决方案1】:

我不确定这是否是同样的问题。我在模式弹出窗口中有一个 botdetect 验证码。它工作正常,直到通过第一次验证正常,之后它总是正确的所以我添加了一个 samplecaptcha.Reset() 并且当它无效时 Model.IsValid 再次为假。

@{
    Layout = null;
    MvcCaptcha sampleCaptcha = new MvcCaptcha("SampleCaptcha");
    sampleCaptcha.Reset();
}

[等]

【讨论】:

  • 重置似乎是一种临时解决方法,从长远来看可能并不可靠。我建议挖掘/调试验证码并弄清楚发生了什么。如果您可以使用dotnetfiddle.net/CsMvc 之类的方式发布代码或创建小提琴,那么我可以尝试帮助您进行调查。
【解决方案2】:

//我和你有同样的问题,但是我用这种方法解决了

    public ActionResult RegistrationComp(NewRegistration data, bool captchaValid)
    {
        try
        {
            captchaValid = MvcCaptcha.Validate(data.CaptchaID, data.CaptchaCode, data.CurrentInstanceID);

            MvcCaptcha.ResetCaptcha(data.CaptchaID);

            if (!captchaValid)
                return this.Json("false");
            else
                return this.Json("true");

        }
        catch (Exception ex)
        {
            return this.Json("false");
        }
    }

在RegistrationModel中添加属性:CaptchaID,CaptchaCode用户输入,CurrentInstanceID

cshtml

MvcCaptcha exampleCaptcha = new MvcCaptcha("C");

exampleCaptcha.UserInputID = "CC";

<script>
 $.post("@Url.Action("RegistrationComp", "Authentication")", { CaptchaCode: $("#CC").val() , CaptchaID: '@exampleCaptcha.CaptchaId',CurrentInstanceID: '@exampleCaptcha.CurrentInstanceId' }, function (data) {});
</script>

【讨论】:

  • 谢谢!我会试试看。
猜你喜欢
  • 1970-01-01
  • 2021-10-18
  • 2011-12-31
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多