C# 验证码nuget包在ASP.NET MVC 5上始终有效

C# 验证码nuget包在ASP.NET MVC 5上始终有效,c#,asp.net-mvc,captcha,C#,Asp.net Mvc,Captcha,我已安装并按照安装说明进行了操作。验证码在页面上完美呈现,但在提交表单时,无论我输入什么,ModelState.IsValid始终为true。很明显,如果验证码不能验证,那对我没什么好处 这是我的控制器: [HttpPost] [CaptchaValidation("CaptchaCode", "SampleCaptcha", "Incorrect CAPTCHA code!")] public ActionResult Register(AccountModel

我已安装并按照安装说明进行了操作。验证码在页面上完美呈现,但在提交表单时,无论我输入什么,ModelState.IsValid始终为true。很明显,如果验证码不能验证,那对我没什么好处

这是我的控制器:

        [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>

@LabelFor(m=>m.FirstName,新的{@class=“col-sm-2控制标签”})
@TextBoxFor(m=>m.FirstName,新的{placeholder=“First Name”})
@LabelFor(m=>m.LastName,新的{@class=“control label”,placeholder=“Last Name”})
@TextBoxFor(m=>m.LastName,新的{placeholder=“LastName”})
@LabelFor(m=>m.Email,新的{@class=“col-sm-2控制标签”,placeholder=“Email”})
@Html.TextBoxFor(m=>m.Email,新的{placeholder=“Email”})
@{MvcCaptcha sampleCaptcha=新的MvcCaptcha(“sampleCaptcha”);}
@Html.Captcha(sampleCaptcha)
@文本框(“CaptchaCode”)
验证码在这里

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

我不确定是不是同样的问题。我在模式弹出窗口中找到了一个botdetect验证码。在通过第一次验证之前,它一直正常工作,然后它始终为true,因此我添加了一个samplecaptcha.Reset(),当Model.IsValid无效时,它再次为false

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

[etc]

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

    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>
MvcCaptcha示例验证码=新的MvcCaptcha(“C”);
示例captcha.UserInputID=“CC”;
$.post(@Url.Action(“RegistrationComp”,“Authentication”),{CaptchaCode:$(“#CC”).val(),CaptchaID:'@exampleCaptcha.CaptchaID',CurrentInstanceID:'@exampleCaptcha.CurrentInstanceID',函数(数据){});

哪个验证码插件?其中一个属性使您的VM从库的模型继承的属性变得至关重要(在这种情况下,这可能是问题所在——MVC不知道其他属性(y/y),也没有理由验证它)。编辑刮擦,链接几乎是第一个字。更新:我做了一些事情,比如添加captcha字段作为模型属性,在最后一次传递时,它神奇地开始工作。我不知道为什么-/您是否执行了包括路由更改在内的说明的其余部分?重置似乎是一种临时解决方法,从长远来看可能不可靠。我建议对验证码进行挖掘/调试,并弄清楚到底发生了什么。如果你可以使用类似的东西发布代码或创建小提琴,那么我可以尝试帮助你进行调查。谢谢!我试试看。