ModelState.IsValid 在验证之前为假

ModelState.IsValid is false prior to validation

我们编写了一个自定义模型绑定器,它覆盖了 ComplexTypeModelBinderCreateModel 方法,这样我们就可以将 injection 放入我们的 ViewModels 而不必通过injected clientsreposcontroller.

到我们的 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.IsValidfalse,即使有 0 errors... 这会导致 ValidationSummary 显示为空,周围有红色边框。一个烦人的解决方法是在将 model 发送到 view 之前调用 ModelState.Clear() method。我可以以某种方式更改它,以便在 validation 尚未成为 运行 时 IsValid 默认为 true 吗?或者有更好的方法吗?

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

  1. 创建一个包装验证摘要的部分。在该部分中,在呈现验证摘要之前检查模型状态中是否存在任何错误。使用该部分代替您使用独立验证摘要的位置。
  2. 添加一些 CSS 以隐藏包含 div 的内容(如果它不包含任何已填充或可见的列表项)。如果没有可见的错误列表项,容器的显示应该是 none.

有关更多信息,请参阅此内容:Related Question