5
votes

I am trying to use fluent validation with ASP.NET MVC project. I am trying to validate my view model.

This is my viewmodel,

[Validator(typeof(ProductCreateValidator))]
public class ProductCreate
{
    public string ProductCategory   { get; set; }
    public string ProductName       { get; set; }
    ....
}

This is my validator class,

public class ProductCreateValidator : AbstractValidator<ProductCreate> 
{
    public ProductCreateValidator()
    {
        RuleFor(product => product.ProductCategory).NotNull();
        RuleFor(product => product.ProductName).NotNull();
    }
}

And in my controller, I am checking whether my ModelState is valid or not,

[HttpPost]
public ActionResult Create(ProductCreate model)
{
    /* This is a method in viewmodel that fills dropdownlists from db */
    model.FillDropDownLists();

    /* Here this is always valid */
    if (ModelState.IsValid)
    {
        SaveProduct(model);
        return RedirectToAction("Index");
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

This is what I have. My problem is ModelState.IsValid returns true when my viewmodel is completely empty. Do i need to manually configure Fluent validation so that model errors can be added to ModalState ?

1

1 Answers

7
votes

As the documentation explains, make sure you have added the following line in your Application_Start in order to swap the data annotations model metadata provider and use fluent validation instead:

FluentValidationModelValidatorProvider.Configure();

Also the following comment in your action scares me:

/* This is a method in viewmodel that fills dropdownlists from db */
model.FillDropDownLists();

A View model shouldn't know what a database means. So having such methods in your view model is a very wrong approach.