Asp.net mvc 5 让验证码插件与注册操作一起工作

Asp.net mvc 5 让验证码插件与注册操作一起工作,asp.net-mvc-5,captcha,Asp.net Mvc 5,Captcha,我让登录部分工作,注册页面清楚地显示验证码,的.dll表示AccountController不包含verifyReCAPTCHA的定义,但它与登录部分一起工作: 示例: 正在工作的登录名: [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)

我让登录部分工作,注册页面清楚地显示验证码,的.dll表示AccountController不包含verifyReCAPTCHA的定义,但它与登录部分一起工作:

示例:

正在工作的登录名:

 [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            // Verify the recaptcha response.
            ReCaptchaResponse response = await this.verifyReCAPTCHA(model, "key", true);
            if (response.Success)
            {
                var user = await UserManager.FindAsync(model.UserName, model.Password);
                if (user != null)
                {
                    await SignInAsync(user, model.RememberMe);
                    return RedirectToLocal(returnUrl);
                }
                else
                {
                    ModelState.AddModelError("", "Invalid username or password.");
                }
            }
            else
            {
                ModelState.AddModelError("", "Invalid Captcha Code!");
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }
[HttpPost]
[异名]
[ValidateAntiForgeryToken]
公共异步任务登录(LoginView模型,字符串返回URL)
{
if(ModelState.IsValid)
{
//验证recaptcha响应。
ReCaptchaResponse response response=等待此消息。验证RECAPTCHA(模型,“键”,true);
if(response.Success)
{
var user=await UserManager.FindAsync(model.UserName,model.Password);
如果(用户!=null)
{
等待符号同步(用户,model.RememberMe);
返回重定向到本地(returnUrl);
}
其他的
{
AddModelError(“,“无效的用户名或密码”);
}
}
其他的
{
AddModelError(“,”无效的验证码!”);
}
}
//如果我们走到这一步,有些东西失败了,重新显示形式
返回视图(模型);
}
在verifyReCAPTCHA上抛出错误的我的寄存器模型:

       [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            //Verify the recaptcha response.
            ReCaptchaResponse response = await this.verifyReCAPTCHA(model, "key", true);
            if (response.Success)
            {
                var user = new ApplicationUser() { UserName = model.UserName };
                var result = await UserManager.CreateAsync(user, model.Password);
                if (result.Succeeded)
                {
                    await SignInAsync(user, isPersistent: false);
                    return RedirectToAction("Index", "Home");
                }
                else
                {
                    AddErrors(result);
                }
            }
        }
        // If we got this far, something failed, redisplay form
        return View(model);
    }
[HttpPost]
[异名]
[ValidateAntiForgeryToken]
公共异步任务寄存器(RegisterViewModel模型)
{
if(ModelState.IsValid)
{
//验证recaptcha响应。
ReCaptchaResponse response response=等待此消息。验证RECAPTCHA(模型,“键”,true);
if(response.Success)
{
var user=new ApplicationUser(){UserName=model.UserName};
var result=await UserManager.CreateAsync(用户、模型、密码);
if(result.successed)
{
等待信号同步(用户,ispersist:false);
返回重定向到操作(“索引”、“主页”);
}
其他的
{
加法器(结果);
}
}
}
//如果我们走到这一步,有些东西失败了,重新显示形式
返回视图(模型);
}
我得到的错误


错误1“ReCaptchaMVC5Test.Controllers.AccountController”不包含“verifyReCAPTCHA”的定义。

从源代码中可以看出,有一个扩展方法您无法访问。看起来您需要使用ReCaptcha.Mvc5添加
到控制器源文件的顶部以获得访问权限


另外,确保您的
模型
继承自
ReCaptcha.Mvc5.model.ReCaptchaViewModel
(如其中所示),这样您就满足了方法签名。

假设这两个方法都在AccountController上,验证ReCaptcha的方法签名是什么,因为这两个方法都发送不同的模型(LoginViewModel和RegisterViewModel)是否都从正确的基础继承?

模型文件夹内>AccountViewModels.cs中有

public class LoginViewModel : ReCaptchaViewModel

公共类RegisterViewModel:

这就是如何将验证码的视图模型分配给其他模型的方法

这是一个很好的注释示例(当需要在帖子中进一步澄清时,从技术上讲,这不是一个答案)@BradChristie事实上我同意你的看法,虽然我添加了进一步的澄清,但可能会是一个更好的评论,尽管我不确定我是否理解,我想你说的是这个控制器。verifyReCaptcha(ReCaptcha.Mvc5.Model.ReCaptchaViewModel,string privatekey,[bool secure=false]没错,但正如您从另一个答案中注意到的,您需要继承ReCAPTCHAVIEWMODEL,您可能会认为,但我使用的是Recaptcha.Mvc5;事实上登录和注册都在同一个accountcontroller文件中,因此它在注册(RegisterViewModel)上抛出错误很奇怪,除了登录名之外,我没有在任何地方尝试过它,实际上我也没有争论语义,但是C是否大写(我假设是复制粘贴错误)?啊,刚刚注意到。你传递了错误的模型。你需要提供一个
ReCaptchaViewModel
(而不是传递到你的操作中的
registervewmodel
)。基本上,您正在尝试命中一个不存在的签名。(您的
LoginViewModel
是否继承自
ReCaptchaViewModel
,但您的
RegisterViewModel
是否不继承?)好的,这很有意义,我会尝试一下,我不确定LoginViewModel是如何从ReCaptchaViewModelWell继承的,您需要满足我上面提到的签名。唯一的方法是提供一个
ReCaptchaViewModel
的实例。(而且,根据他们的说法,LoginViewModel确实继承自
ReCaptchaViewModel
。因此,如果您遵循了示例,您可能会在不知情的情况下这样做。-)解决方案属于答案,而不是对原始问题的编辑。我已回滚编辑,因为@majache发布了相同的内容(您已接受)。
public class RegisterViewModel : <Place 'RecaptchaViewModel' Here>