我们编写了一个自定义模型绑定器,该绑定器覆盖了ComplexTypeModelBinder
的CreateModel
方法,以便我们可以injection
到我们的ViewModels
中,而不必将injected clients
和repos
从controller
传递给我们的model
。
例如,对于这样的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
中,如果我们在view
中使用ValidationSummary
,因为validation
没有运行,所以ModelState.IsValid
是false
的,即使有0 errors
......这会导致ValidationSummary
显示为空,周围带有红色边框。一个烦人的解决方法是在将model
发送到view
之前调用ModelState.Clear() method
。我可以以某种方式更改它,以便在尚未运行时默认validation
IsValid
true
?还是有更好的方法?
此问题与 IoC 模型绑定无关。 MVC 存在一个问题,即即使没有验证错误,仍会为验证摘要呈现空容器。 两种可能的解决方法包括:
- 创建包装验证摘要的部分。 在该部分中,在呈现验证摘要之前检查模型状态中的任何错误。 使用该部分代替使用独立验证摘要的位置。
- 添加一些 CSS,如果包含div 不包含任何填充或可见的列表项,则隐藏该div。 如果没有可见的错误列表项,则容器的显示应为"无"。
有关其他信息,请参阅此内容:相关问题