C# ModelState.IsValid为false,但应为true
我有一个带有AJAX更新的ASP.NET MVC应用程序。除创建“收据”外,每个实体的CRUD操作都正常工作。当控制器点击C# ModelState.IsValid为false,但应为true,c#,asp.net,ajax,asp.net-mvc,modelstate,C#,Asp.net,Ajax,Asp.net Mvc,Modelstate,我有一个带有AJAX更新的ASP.NET MVC应用程序。除创建“收据”外,每个实体的CRUD操作都正常工作。当控制器点击ModelState.IsValid时会出现问题,该值会转换为false,而实际上它应该为true。我一步一步地调试了很多次,当它应该是真的时候,它总是假的 我使用实体框架进行实体操作,这是从SQL Server数据库生成的代码: public partial class Receipt { [System.Diagnostics.CodeAnalysis.Suppr
ModelState.IsValid
时会出现问题,该值会转换为false,而实际上它应该为true。我一步一步地调试了很多次,当它应该是真的时候,它总是假的
我使用实体框架进行实体操作,这是从SQL Server数据库生成的代码:
public partial class Receipt
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Receipt()
{
this.Receipts1 = new HashSet<Receipt>();
this.Seminars = new HashSet<Seminar>();
}
public int Id { get; set; }
public System.DateTime IssueDate { get; set; }
public Nullable<System.DateTime> DeliveryDate { get; set; }
public Nullable<System.DateTime> PaymentDue { get; set; }
public Nullable<short> CompanyId { get; set; }
public Nullable<int> Number { get; set; }
public Nullable<int> ClosedReceiptId { get; set; }
public Nullable<decimal> ReturnedAmount { get; set; }
public Nullable<short> ReturnTypeId { get; set; }
public virtual Company Company { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Receipt> Receipts1 { get; set; }
public virtual Receipt Receipt1 { get; set; }
public virtual ReturnType ReturnType { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Seminar> Seminars { get; set; }
}
控制器中我的创建
功能如下:
[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult Create([Bind(Include = "Id,IssueDate,DeliveryDate,PaymentDue,CompanyId,Number")]Receipt receipt, int? seminarId)
{
if (seminarId == null)
{
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return Json(new { Message = "ID is required" });
}
Seminar seminar = db.Seminars.Find(seminarId);
if (seminar == null)
{
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return Json(new { Message = "Seminar doesn't exist" });
}
int receiptNumber = db.Receipts.Where(r => r.CompanyId == receipt.CompanyId && r.ClosedReceiptId == null && r.IssueDate.Year == DateTime.Now.Year).Count() + 1;
receipt.Number = receiptNumber;
receipt.IssueDate = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.Now, TimeZoneInfo.Local.Id, "Central European Standard Time");
if (ModelState.IsValid)
{
try
{
db.Receipts.Add(receipt);
db.SaveChanges();
seminar.ReceiptId = receipt.Id;
db.Entry(seminar).State = EntityState.Modified;
db.SaveChanges();
GeneratePDF(receipt.Id, receipt.ReceiptNumber, receipt.CompanyId.ToString());
return Json(new { receipt.Id, receipt.PDFLink, Action = "Create", Message = "Receipt successfully added! -> " }, JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return Json(new { Message = ex.Message });
}
}
Response.StatusCode = (int)HttpStatusCode.BadRequest;
IEnumerable<ModelError> allErrors = ModelState.Values.SelectMany(v => v.Errors);
List<string> errorMessages = new List<string>();
foreach (ModelError error in allErrors)
{
errorMessages.Add(error.ErrorMessage);
}
return Json(new { Message = errorMessages });
}
前面的几行是有效的
有人能帮忙吗
编辑:这是调试的屏幕截图,modelstate键完全错误:
输入操作时,模型状态已被评估(且无效),设置“Number”属性将不会再次评估模型。设置属性后,您可能必须通过编写以下命令手动将其从模型错误中删除:
ModelState.Remove("Number");
输入操作时,ModelState已计算(且无效),设置“Number”属性将不会再次计算模型。设置属性后,您可能必须通过编写以下命令手动将其从模型错误中删除:
ModelState.Remove("Number");
我认为的值是有效的,整个ModelState是在您对控制器代码进行任何更改之前计算出来的。太晚了!我相信
ModelState
记录了您发布数据时的模型状态。您应该将属性设置为可空
。我关心的是,正如您从ReceiptMetadata中看到的那样,“IssueDate”也是必需的,并且放在数字后面,但不会出现任何错误。我用调试模式下ModelState错误的图像更新了主要问题,这非常奇怪,并且显示了错误的键,因为它们应该是“PaymentDue”、“IssueDate”和“Number”,而不是“CompanyId”或“seminard”这只是一个辅助属性,我认为的值是有效的,整个ModelState是在您对控制器代码进行任何更改之前计算出来的。太晚了!我相信ModelState
记录了您发布数据时的模型状态。您应该将属性设置为可空
。我关心的是,正如您从ReceiptMetadata中看到的那样,“IssueDate”也是必需的,并且放在数字后面,但不会出现任何错误。我用调试模式下ModelState错误的图像更新了主要问题,这非常奇怪,并显示了错误的键,因为它们应该是“PaymentDue”、“IssueDate”和“Number”,而不是“CompanyId”或“SeminAnd”,这只是一个帮助属性。谢谢,这解决了我的问题。但是我仍然想知道为什么我的ModelState键显示不正确,我的MetadataIssueDate中需要的缺少发布日期是模型中的DateTime,如果您使用调试器检查该值,它可能会有最小日期时间值:0001年1月1日。听起来可能有点奇怪,但如果您想将其设置为必需并检查空值,请尝试将其更改为“DateTime?”谢谢,这样就解决了我的问题。但是我仍然想知道为什么我的ModelState键显示不正确,我的MetadataIssueDate中需要的缺少发布日期是模型中的DateTime,如果您使用调试器检查该值,它可能会有最小日期时间值:0001年1月1日。听起来可能有点奇怪,但如果您想将其设置为必需并检查空值,请尝试将其更改为“DateTime?”
ModelState.Remove("Number");