Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core mvc 验证前,ModelState.IsValid为false_Asp.net Core Mvc_Modelstate_Custom Model Binder - Fatal编程技术网

Asp.net core mvc 验证前,ModelState.IsValid为false

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

我们编写了一个自定义模型绑定器,它覆盖ComplexTypeModelBinder的CreateModel方法,这样我们就可以向ViewModels中进行注入,而不必将注入的客户端和repo从控制器传递给我们的模型

例如,对于这样的模型:

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;
}