ASP.NET Core MVC 6.0模型验证失败无需自定义验证的解决方案咨询
问题原因
你的验证失败是.NET 6+默认启用可空引用类型导致的:EF Core自动生成的Ilceler实体类中,Iller类型的导航属性Il被标记为非空引用类型(= null!),ASP.NET Core模型验证会默认校验所有非空引用类型属性是否有有效值,你的提交表单只传了IlId、IlceAd等字段,没有对Il导航属性赋值,因此触发验证失败。
以下三个方案都不需要编写自定义验证逻辑,操作都非常简单:
方案1:修改导航属性为可空(最推荐)
直接修改Ilceler模型中Il属性的定义,将其标记为可空引用类型即可:
// 把原来的非空定义 // public virtual Iller Il { get; set; } = null!; // 修改为 public virtual Iller? Il { get; set; }
该修改不会影响外键IlId的正常使用,也不会破坏EF Core的映射关系,完全符合你不需要用到Iller导航属性的业务场景。
方案2:给导航属性加忽略验证标记
如果你不想修改实体类的可空声明,只需要在Il属性上加[ValidateNever]特性,模型验证就会自动跳过该属性:
using Microsoft.AspNetCore.Mvc; // 其他属性不变 [ValidateNever] public virtual Iller Il { get; set; } = null!;
方案3:控制器中手动清除对应验证错误
如果不想修改模型代码,只需要在控制器判断ModelState.IsValid之前,手动移除Il属性对应的验证错误即可:
public async Task<IActionResult> Create([Bind("IlceId,IlId,IlceAd")] Ilceler ilceler) { // 新增这一行即可 ModelState.Remove(nameof(Ilceler.Il)); if (ModelState.IsValid) { // 原有逻辑不变 } // 原有逻辑不变 }
内容的提问来源于stack exchange,提问作者dilem-ma-vi
相关产品推荐
相关产品推荐

