FluentValidation ModelState.IsValid always true

匆匆过客 提交于 2019-12-11 03:36:48

问题


Ok my problem is the modelvalidator from fluentValidation is not working in my project, and ModelState.IsValid is always true no matter the state of the validation, im using asp.net mvc 4, .net 4.5, thx in advance.

Global.asax

protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();
        FluentValidationModelValidatorProvider.Configure();
    }

LoginViewModel

using FluentValidation.Attributes;

namespace ViewModel.Cuentas
{

 [Validator(typeof(LoginViewModel))]
 public class LoginViewModel
 {
    public string UserName { get; set; }
    public string Password { get; set; }
 }
}

LoginViewModelValidator

using FluentValidation;
using FluentValidation.Results;
namespace ViewModel.Cuentas.Validadores
{
    public class LoginViewModelValidator : AbstractValidator<LoginViewModel>
    {
        public LoginViewModelValidator()
        {
        RuleFor(x => x.UserName).NotEmpty().WithMessage("El Campo Usuario es Necesario");
        RuleFor(x => x.Password).NotEmpty().WithMessage("El Campo Usuario es Necesario");
        }
   }
}

and my account controller

   [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginViewModel viewModel)
    {
        if (!ModelState.IsValid)
        {
            return View();
        }
        FormsAuthentication.SetAuthCookie(viewModel.UserName, false);
        if (!String.IsNullOrEmpty(returnUrl) && returnUrl != "/")
        {
            return Redirect(returnUrl);
        }
        return RedirectToAction("Enviar", "Cartas");
    }

回答1:


Your Validator attribute appears to have the wrong type. You have:

[Validator(typeof(LoginViewModel))]
public class LoginViewModel

The type argument should be your validator class - LoginViewModelValidator. So it would be like this:

[Validator(typeof(LoginViewModelValidator))]
public class LoginViewModel



回答2:


Addition to accepted answer: If user using Aspnet Core framework need to be registered as service in Statrup.cs ( under 'ConfigureServices' method)

services.AddTransient<IValidator<LoginViewModel>, LoginViewModelValidator>();

[Validator(typeof(LoginViewModelValidator))] filter may not work as expected.




回答3:


Also, don't forget to register your validators.

services.AddTransient<IValidator<LoginViewModel>, LoginViewModelValidator>(); 

or

.AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<Startup>())


来源:https://stackoverflow.com/questions/17367799/fluentvalidation-modelstate-isvalid-always-true

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!