ASP.NET Core表单绑定字符串属性时Required注解验证报错异常
问题根因
你遇到的验证提示错误是两个原因共同导致的:
- 分部视图渲染时自动添加了字段前缀:你在主视图使用
<partial>标签时指定了for="CommentsViewModel",分部视图内所有asp-for生成的表单控件都会自动加上CommentsViewModel.前缀,最终提交的字段名是CommentsViewModel.NewComment,和你POST方法的参数名无法匹配,导致NewComment字段绑定失败 - .NET 6+默认开启可空引用类型验证:你的项目如果开启了
<Nullable>enable</Nullable>配置,未加?的string类型属性会被自动添加隐式非空验证,优先级高于你显式添加的[Required]注解,绑定失败时就会返回默认的The value '' is invalid错误提示
解决方案
你可以任选一种即可:
方案1:调整Action参数绑定前缀
修改你的POST方法参数,给commentsViewModel添加绑定前缀匹配前端提交的字段:
public async Task<ActionResult> AddCommentFromTranslationSetDetailView( [Bind(Prefix = "CommentsViewModel")] CommentsViewModel commentsViewModel, [FromServices] ITranslationSetDetailBuilderService builderService)
方案2:移除分部视图的字段前缀
在你的_TranslationSetDetailCommentsPartial分部视图最顶部添加以下代码,取消生成字段前缀:
@{ ViewData.TemplateInfo.HtmlFieldPrefix = ""; }
可选:自定义错误提示
如果你需要显式指定错误提示文本,直接修改ViewModel的[Required]注解即可:
[Required(ErrorMessage = "The Comment field is required.")] public string? NewComment { get; set; }
这里给string添加?是为了关闭隐式非空验证,确保你自定义的[Required]注解生效。
内容的提问来源于stack exchange,提问作者Matteo Catrini
相关产品推荐
相关产品推荐

