2012-04-13 4 views
2

FluentValidation을 사용하여 ReCaptcha의 유효성을 검사하려고하지만 몇 가지 문제가 있습니다. ReCaptcha.Validate가 true를 반환하더라도 ModelState는 유효하지 않습니다. ReCaptcha의 유효성을 검사하기 위해 뷰 모델에서 필드를 추가했습니다. ModelState가 유효한지 확인하기 전에 ReCaptcha 필드를 ReCaptcha.Validate에서 반환되는 값으로 설정합니다.Fluent Validation이있는 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을 사용하여 완벽하게 작동 helpers..it은 Microsoft 웹을 시도하는 필수가 아닌 경우 ..