我们编写了一个自定义模型绑定器,它覆盖了CreateModel
的{{1}}方法,以便我们可以将ComplexTypeModelBinder
放入injection
,而不必通过ViewModels
1}}和injected clients
来自repos
的{{1}}。
例如,对于这样的model
:
controller
在model
我们可以做到:
public class ThingViewModel
{
public ThingViewModel (IThingRepo thingRepo) {}
}
这很有效,这里是controller
的覆盖部分:
public class ThingController : Controller
{
public IActionResult Index(ThingViewModel model) => View(model);
}
相当简单的东西。
问题是,在我们的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;
}
中使用GET action methods
,因为ValidationSummary
未运行,view
是validation
,即使有ModelState.IsValid
...这会导致false
显示为空,并在其周围显示红色边框。一个令人讨厌的解决方法是在将0 errors
发送到ValidationSummary
之前致电ModelState.Clear() method
。我可以以某种方式更改它,以便model
在view
尚未运行时默认为IsValid
吗?或者有更好的方法吗?
答案 0 :(得分:1)
此问题与IoC模型绑定无关。即使您没有验证错误,MVC仍然会为验证摘要呈现一个空容器。两种可能的解决方法包括:
有关其他信息,请参阅此处:Related Question