Asp.net core mvc 验证前,ModelState.IsValid为false
我们编写了一个自定义模型绑定器,它覆盖ComplexTypeModelBinder的CreateModel方法,这样我们就可以向ViewModels中进行注入,而不必将注入的客户端和repo从控制器传递给我们的模型 例如,对于这样的模型:Asp.net core mvc 验证前,ModelState.IsValid为false,asp.net-core-mvc,modelstate,custom-model-binder,Asp.net Core Mvc,Modelstate,Custom Model Binder,我们编写了一个自定义模型绑定器,它覆盖ComplexTypeModelBinder的CreateModel方法,这样我们就可以向ViewModels中进行注入,而不必将注入的客户端和repo从控制器传递给我们的模型 例如,对于这样的模型: public class ThingViewModel { public ThingViewModel (IThingRepo thingRepo) {} } 在控制器中,我们可以执行以下操作: public class ThingControll
public class ThingViewModel
{
public ThingViewModel (IThingRepo thingRepo) {}
}
在控制器中,我们可以执行以下操作:
public class ThingController : Controller
{
public IActionResult Index(ThingViewModel model) => View(model);
}
这非常有效,这是自定义模型绑定器的覆盖部分:
非常简单的东西
问题是,在我们的GET操作方法中,如果我们在视图中使用ValidationSummary,因为验证没有运行,ModelState.IsValid是false,即使有0个错误。。。这会导致ValidationSummary显示为空,周围有一个红色边框。一个恼人的解决方法是在将模型发送到视图之前调用ModelState.Clear方法。我是否可以更改它,以便在验证尚未运行时,IsValid默认为true?还是有更好的方法?此问题与IoC模型绑定无关。MVC仍然存在为验证摘要呈现空容器的问题,即使您没有验证错误。两种可能的解决办法包括: 创建包装验证摘要的分部。在该部分中,请在呈现验证摘要之前检查模型状态中的任何错误。在使用独立验证摘要的地方使用该部分。 添加一些CSS,如果包含的div不包含任何填充的或可见的列表项,则隐藏该div。如果没有可见的错误列表项,则容器的显示应为无。
有关其他信息,请参见此部分:2的唯一问题是,无论是否存在错误,它都有一个问题。
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;
}