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?