创建验证错误但有效的ModelState
本文关键字:ModelState 有效 验证 错误 创建 | 更新日期: 2023-09-27 18:05:50
我试图在MVC 5内创建,并且即使ModelState返回有效,我也会得到验证错误。
错误消息一个或多个实体的验证失败。详细信息请参见'EntityValidationErrors'属性。
,当我查看消息时,它显示....
名称'e'在当前上下文中不存在
当我查看POST数据时,创建的模型已经填充了所有必需的字段。我注意到模型ID
被指定为0
。我不确定这是否是错误,或者它是否应该为ID传递零。
可能是什么问题?
WosController.cs
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create([Bind(Include = "id,woNumber,woDescription,dueDate,qty,item_id,releaseDate,parentWO_id,wip_id")] Wo wo)
{
if (ModelState.IsValid)
{
db.Wos.Add(wo);
await db.SaveChangesAsync();
return RedirectToAction("Index");
}
return View(wo);
}
Wo.cs
public partial class Wo
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Wo()
{
this.WoParts = new HashSet<WoPart>();
this.WoStatuses = new HashSet<WoStatus>();
}
public int id { get; set; }
public string woNumber { get; set; }
public string woDescription { get; set; }
public Nullable<System.DateTime> dueDate { get; set; }
public string qty { get; set; }
public Nullable<int> item_id { get; set; }
public Nullable<System.DateTime> releaseDate { get; set; }
public string status { get; set; }
public Nullable<int> parentWO_id { get; set; }
public int wip_id { get; set; }
public Nullable<int> part_id { get; set; }
public virtual Item Item { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<WoPart> WoParts { get; set; }
public virtual Wo woParentWO { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<WoStatus> WoStatuses { get; set; }
public virtual Part Part { get; set; }
public virtual Wip Wip { get; set; }
}
将SaveChangesAsync
调用封装在try...catch
中,如下所示:
try
{
await db.SaveChangesAsync();
}
catch (DbEntityValidationException e)
{
var errorMessages = e.EntityValidationErrors
.SelectMany(x => x.ValidationErrors)
.Select(x => x.ErrorMessage);
var fullErrorMessage = string.Join("; ", errorMessages);
var exceptionMessage = string.Concat(e.Message, " The validation errors are: ", fullErrorMessage);
throw new DbEntityValidationException(exceptionMessage, e.EntityValidationErrors);
}
将显示导致验证问题的实际属性。然后,如果你仍然需要帮助,用结果更新你的问题。
很可能,您的数据库与您的实体不同步。你的实体不需要status
属性,默认情况下,string
类型的属性是可空的。这就解释了为什么你在post上传递验证,但实际上没有保存实体。
一般来说,最好一开始就不要依赖数据库设置默认值。相反,让属性本身有一个默认值,然后它总是很好,不管在数据库级别发生了什么:
private string _status;
public string status
{
get { return _status ?? "Default Value"; }
set { _status = value;
}
除此之外,如果确实不需要status,那么您应该确保表上的status
列是可空的。