验证之前ModelState.IsValid为false

时间:2017-03-16 17:11:00

标签: asp.net-core-mvc modelstate custom-model-binder

我们编写了一个自定义模型绑定器,它覆盖了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未运行,viewvalidation,即使有ModelState.IsValid ...这会导致false显示为空,并在其周围显示红色边框。一个令人讨厌的解决方法是在将0 errors发送到ValidationSummary之前致电ModelState.Clear() method。我可以以某种方式更改它,以便modelview尚未运行时默认为IsValid吗?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

此问题与IoC模型绑定无关。即使您没有验证错误,MVC仍然会为验证摘要呈现一个空容器。两种可能的解决方法包括:

  1. 创建包含验证摘要的部分。在该部分中,在呈现验证摘要之前检查模型状态中的任何错误。使用该部分替代您将使用独立验证摘要的位置。
  2. 添加一些隐藏包含div的CSS,如果它不包含任何已填充或可见的列表项。如果没有可见的错误列表项,则容器的显示应为none。
  3. 有关其他信息,请参阅此处:Related Question