如何避免View中出现ModelState无效属性错误
解决方案
- 方案1:直接移除指定属性的ModelState错误
这是最贴合你需求的直接解决方案,仅需在判断ModelState.IsValid之后、返回视图之前调用Remove方法清除对应字段的校验错误即可:
if (ModelState.IsValid) { //执行业务逻辑 return RedirectToAction(...); } // 清除CreatedOnUtc字段的所有校验错误 ModelState.Remove(nameof(YourModelClass.CreatedOnUtc)); return View(model);
该方案无需修改视图代码,也不需要给字段赋值无意义的虚拟值,对现有代码侵入性最小。
- 方案2:视图层面区分场景渲染字段
因为该分部视图是Edit和Create共用的,你可以在分部视图中增加场景判断,仅在编辑场景下渲染该隐藏字段,从根源避免Create场景下出现该字段的校验问题:
@* 可通过Id是否为默认值、或者自定义ViewData参数判断当前是编辑还是新增场景 *@ @if (Model.Id != default) { <input asp-for="CreatedOnUtc" type="hidden"/> }
- 方案3:自定义校验规则实现条件校验
如果需要从模型校验层面彻底解决该问题,可以给CreatedOnUtc属性增加条件校验逻辑:- 若使用FluentValidation,可以直接编写条件规则,仅当实体Id不为默认值(编辑场景)时才校验
CreatedOnUtc必填 - 若使用原生数据注解校验,可以实现
IValidatableObject接口,在自定义校验方法中根据场景判断是否需要校验CreatedOnUtc
- 若使用FluentValidation,可以直接编写条件规则,仅当实体Id不为默认值(编辑场景)时才校验
内容的提问来源于stack exchange,提问作者anastaciu
相关产品推荐
相关产品推荐

