2012-04-13 9 views
2

Ich versuche ReCaptcha mit FluentValidation zu validieren, aber ich habe einige Probleme. Obwohl das ReCaptcha.Validate True zurückgibt, ist das ModelState nicht gültig. Um das ReCaptcha zu validieren, habe ich ein Feld im View-Modell hinzugefügt. Bevor ich überprüfe, ob der ModelState gültig ist, setze ich das ReCaptcha-Feld auf das, was von ReCaptcha.Validate zurückgegeben wird.MVC3 ReCaptcha mit Fluent Validation

[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"); 
     } 
    } 

The Razor Code sieht wie folgt aus ...

<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

Und das funktioniert nicht? – Romias

Antwort

0

Wenn es nicht zwingend notwendig ist fluentvalidation zu verwenden captcha zum Validieren ... versuchen, die Microsoft-helpers..it perfekt funktioniert ..