We wrote a custom model binder that overrides the CreateModel
method of the ComplexTypeModelBinder
so that we can have injection
into our ViewModels
instead of having to pass the injected clients
and repos
to our model
from the controller
.
For example, for a model
like this:
public class ThingViewModel
{
public ThingViewModel (IThingRepo thingRepo) {}
}
In our controller
we can do:
public class ThingController : Controller
{
public IActionResult Index(ThingViewModel model) => View(model);
}
And this works pretty well, here's the override part of the custom model binder
:
protected override object CreateModel(ModelBindingContext bindingContext)
{
var model = bindingContext.HttpContext.RequestServices.GetService(bindingContext.ModelType);
if (model == null)
model = base.CreateModel(bindingContext);
if (bindingContext.HttpContext.Request.Method == "GET")
{
bindingContext.ValidationState[model] = new ValidationStateEntry { SuppressValidation = true };
}
return model;
}
Pretty straightforward stuff.
The problem, is that in our GET action methods
, if we use a ValidationSummary
in the view
, because validation
was not run, the ModelState.IsValid
is false
, even though there are 0 errors
... this causes the ValidationSummary
to show up empty with a red border around it. An annoying work-around for this is to call the ModelState.Clear() method
prior to sending the model
into the view
. Can I somehow change it so that IsValid
is defaulted to true
when validation
has not been run yet? Or is there a better way?