MVC 5创建验证错误但有效的ModelState

时间:2016-09-06 18:24:50

标签: c# asp.net-mvc validation

我正在尝试在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; }
}

2 个答案:

答案 0 :(得分:1)

将来自SaveChangesAsync的{​​{1}}的电话转发给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);
}

这将显示导致验证问题的实际属性。然后,如果您仍需要帮助,请使用结果更新您的问题。

答案 1 :(得分:1)

可能,您的数据库与您的实体不同步。您的实体不需要status属性,默认情况下,string类型的属性可以为空。这可以解释为什么你在帖子上传递验证,但没有实际保存实体。

通常,最好不要依赖数据库首先设置默认值。相反,让属性本身具有默认值,然后无论数据库级别上发生了什么,它都将始终正常:

private string _status;
public string status
{
    get { return _status ?? "Default Value"; }
    set { _status = value;
}

如果不是这样,如果确实不需要状态,那么您应该确保表上的status列可以为空。