ASP.NET Core 7 MVC模型验证异常:ModelState始终为Valid
ASP.NET Core 7 MVC中MetadataTypeAttribute验证不生效的解决方案
问题根源
ASP.NET Core的模型元数据系统与ASP.NET 4.x存在差异,默认不会自动识别并应用MetadataTypeAttribute,这就是你沿用旧模式但验证失效、ModelState.IsValid始终返回true的核心原因。
解决方案
1. 手动注册元数据类型提供器
在Program.cs的服务配置环节,显式添加MetadataTypeAttributeProvider,让Core MVC能够识别元数据类中的验证规则:
var builder = WebApplication.CreateBuilder(args); // 配置控制器和视图服务,并添加元数据提供器 builder.Services.AddControllersWithViews() .AddMvcOptions(options => { options.ModelMetadataDetailsProviders.Add(new MetadataTypeAttributeProvider()); }); // 其他服务配置代码... var app = builder.Build(); // 中间件配置代码...
2. 确认元数据类与实体类的匹配性
检查以下几点(你的现有代码已符合要求,可快速验证):
- 实体类
TcPhoneType是partial类,且元数据类所在的partial定义与EF自动生成的实体类处于同一命名空间 - 元数据类的属性名称、类型与实体类完全对应(EF生成类的
#nullable disable配置不影响元数据类验证规则的生效)
3. 验证前端依赖脚本
确认_ValidationScriptsPartial中包含了客户端验证所需的脚本(默认ASP.NET Core模板的该文件已包含jquery.validate和jquery.validate.unobtrusive,请勿随意修改或移除)
效果验证
重启项目后,提交不符合验证规则的表单(比如空的PhoneTypeId、超出长度的描述内容),ModelState.IsValid会正确返回false,同时页面会显示对应的验证错误提示。
内容的提问来源于stack exchange,提问作者mcolegro
相关产品推荐
相关产品推荐

