ModelState.IsValid 在验证之前为假
ModelState.IsValid is false prior to validation
我们编写了一个自定义模型绑定器,它覆盖了 ComplexTypeModelBinder
的 CreateModel
方法,这样我们就可以将 injection
放入我们的 ViewModels
而不必通过injected clients
和 repos
从 controller
.
到我们的 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.IsValid
是 false
,即使有 0 errors
... 这会导致 ValidationSummary
显示为空,周围有红色边框。一个烦人的解决方法是在将 model
发送到 view
之前调用 ModelState.Clear() method
。我可以以某种方式更改它,以便在 validation
尚未成为 运行 时 IsValid
默认为 true
吗?或者有更好的方法吗?
此问题与 IoC 模型绑定无关。 MVC 有一个问题,即使您没有验证错误,它仍然会为您的验证摘要呈现一个空容器。两种可能的解决方法包括:
- 创建一个包装验证摘要的部分。在该部分中,在呈现验证摘要之前检查模型状态中是否存在任何错误。使用该部分代替您使用独立验证摘要的位置。
- 添加一些 CSS 以隐藏包含 div 的内容(如果它不包含任何已填充或可见的列表项)。如果没有可见的错误列表项,容器的显示应该是 none.
有关更多信息,请参阅此内容:Related Question
我们编写了一个自定义模型绑定器,它覆盖了 ComplexTypeModelBinder
的 CreateModel
方法,这样我们就可以将 injection
放入我们的 ViewModels
而不必通过injected clients
和 repos
从 controller
.
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.IsValid
是 false
,即使有 0 errors
... 这会导致 ValidationSummary
显示为空,周围有红色边框。一个烦人的解决方法是在将 model
发送到 view
之前调用 ModelState.Clear() method
。我可以以某种方式更改它,以便在 validation
尚未成为 运行 时 IsValid
默认为 true
吗?或者有更好的方法吗?
此问题与 IoC 模型绑定无关。 MVC 有一个问题,即使您没有验证错误,它仍然会为您的验证摘要呈现一个空容器。两种可能的解决方法包括:
- 创建一个包装验证摘要的部分。在该部分中,在呈现验证摘要之前检查模型状态中是否存在任何错误。使用该部分代替您使用独立验证摘要的位置。
- 添加一些 CSS 以隐藏包含 div 的内容(如果它不包含任何已填充或可见的列表项)。如果没有可见的错误列表项,容器的显示应该是 none.
有关更多信息,请参阅此内容:Related Question