2012-04-13 2 views
2

Я пытаюсь проверить ReCaptcha с помощью FluentValidation, но у меня возникают некоторые проблемы. Несмотря на то, что ReCaptcha.Validate возвращает true, ModelState недействителен. Чтобы проверить ReCaptcha, я добавил поле в модель представления. Прежде чем проверять, действителен ли ModelState, я устанавливаю поле ReCaptcha в значение, возвращаемое с ReCaptcha.Validate.MVC3 ReCaptcha с хорошей проверкой

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Index(Over18Model model) 
    { 
     model.ReCaptcha = Microsoft.Web.Helpers.ReCaptcha.Validate("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); 

     if (ModelState.IsValid) 
     { 
      var table = new Prospect(); 
      dynamic o = new ExpandoObject(); 
      { 
       o.FirstName = model.FirstName; 
       o.LastName = model.LastName; 
       o.Email = model.Email; 
      } 
      table.Save(o); 
      return RedirectToAction("ThankYou", "Public"); 
     } 
     ModelState.AddModelError(string.Empty, "Errors: " + string.Join(" ; ", ModelState.Values.SelectMany(x => x.Errors).Select(x => x.ErrorMessage))); 
     return View(model); 
    } 

    [Validator(typeof(Over18ModelValidator))] 
    public class Over18Model 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Email { get; set; } 
     public bool ReCaptcha { get; set; } 
    } 

    public class Over18ModelValidator : AbstractValidator<Over18Model> 
    { 
     public Over18ModelValidator() 
     { 
      RuleFor(x => x.FirstName).NotEmpty().WithMessage("First Name is Required"); 
      RuleFor(x => x.LastName).NotEmpty().WithMessage("Last Name is Required"); 
      RuleFor(x => x.Email).NotEmpty().WithMessage("Email is Required"); 
      RuleFor(x => x.Email).EmailAddress().WithMessage("Invalid Email"); 
      RuleFor(x => x.ReCaptcha).Equal(true).WithMessage("ReCaptcha error"); 
     } 
    } 

Бритва код выглядит следующим образом ...

<div class="signUpOver18"> 
    @using (Html.BeginForm()) 
    { 
     @Html.AntiForgeryToken()   
     @Form.TextBox(name: "FirstName", value: @Model.FirstName, labelText: "First Name:", containerClass: "fname", txtfldClass: "standard names", maxLength: 50) 
     @Form.TextBox(name: "LastName", value: @Model.LastName, labelText: "Last Name:", containerClass: "lname", txtfldClass: "standard names", maxLength: 100) 
     </div> 
     @Form.Submit(value: "Enter The Sweepstakes", myClass: "btnSubmit") 

     <div class="recaptchaHolder"> 
      @ReCaptcha.GetHtml(theme: "red", publicKey: "XXX-XXXX_XXXX-XX_") 
     </div> 

     @Html.ValidationSummary(true) 
    } 
</div> 
+0

И это не работает? – Romias

ответ

0

Если это не обязательно использовать fluentvalidation для проверки капчи ... попробовать Microsoft Web helpers..it работает отлично ..

Смежные вопросы