ModelState.IsValid在验证之前为假



我们编写了一个自定义模型绑定器,该绑定器覆盖了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 不包含任何填充或可见的列表项,则隐藏该div。 如果没有可见的错误列表项,则容器的显示应为"无"。

有关其他信息,请参阅此内容:相关问题

相关内容

  • 没有找到相关文章

最新更新