Asp.net mvc 5 让验证码插件与注册操作一起工作
我让登录部分工作,注册页面清楚地显示验证码,的.dll表示AccountController不包含verifyReCAPTCHA的定义,但它与登录部分一起工作: 示例: 正在工作的登录名: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)
[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>