ASP.NET MVC如何将指定字段从ModelState.IsValid校验中移除
问题解决方案
一、将UserId从ModelState校验逻辑移除的方法
方法1:直接移除指定字段的校验错误(最便捷)
你只需要在给UserId赋值完成后、判断ModelState.IsValid之前,调用ModelState.Remove方法清除对应字段的校验记录即可:
[HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Create([Bind("Id,UserId,Created,TimeStamp,Name,Role,Description,Partner,PartnerAmount,Competitor,IsDeleted")] Relationship relationship) { relationship.UserId = User.Identity.Name.Replace(@"XXXXX\",""); relationship.Created = DateTime.Now; relationship.TimeStamp = DateTime.Now; relationship.IsDeleted = false; // 新增这行清除UserId的校验错误 ModelState.Remove(nameof(Relationship.UserId)); if (ModelState.IsValid) { _context.Add(relationship); await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); } return View(relationship); }
方法2:调整Bind特性的绑定列表
你当前的Bind特性里显式包含了UserId,会触发模型绑定阶段对该字段的取值校验,既然这个字段不需要从前端表单传递,直接从Bind的参数列表里删除UserId即可,模型绑定阶段会忽略该字段,自然不会生成校验错误。
方法3:使用视图模型(更规范)
单独定义前端请求对应的CreateRelationshipViewModel类,只保留需要前端传递的字段,接收请求后再映射到Relationship实体并赋值后台字段,从根源上避免多余的校验问题。
二、不同字段校验差异的原因
这个差异是由字段的类型特性决定的:
UserId是引用类型(通常为string类型),模型绑定阶段如果请求中没有对应值,会被赋值为默认值null,如果字段标注了[Required]特性,null会触发必填校验报错。Created、TimeStamp是DateTime值类型,IsDeleted是bool值类型,值类型的默认值不为null:DateTime默认值为0001-01-01 00:00:00,bool默认值为false,[Required]特性仅校验值是否为null,因此这几个字段即使请求中没有传值,也不会触发必填校验报错。
内容的提问来源于stack exchange,提问作者s15199d
相关产品推荐
相关产品推荐

