以下 if 语句只应在绑定的对象的属性与数据库中已有的记录匹配时执行:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ID,AID,Date,PostPreID")] OL oLevel)
{
if (ModelState.IsValid)
{
if(oLevel.PostPreID == 2)
{
if (db.OL.Any(x => DbFunctions.TruncateTime(x.Date) == DbFunctions.TruncateTime(oLevel.Date) && x.PostPreID == oLevel.PostPreID))
{
ModelState.AddModelError("PostPreID", "There is already a record for this Date!");
return View(oLevel);
}
else
{
db.OL.Add(oLevel);
db.SaveChanges();
return RedirectToAction("Index", new { id = oLevel.AID });
}
}
if(oLevel.PostPreID == 3)
{
if (db.OL.Any(x => DbFunctions.TruncateTime(x.Date) == DbFunctions.TruncateTime(oLevel.Date) && x.PostPreID == oLevel.PostPreID))
{
ModelState.AddModelError("PostPreID", "There is already a record for this Date!");
return View(oLevel);
}
else
{
db.OL.Add(oLevel);
db.SaveChanges();
return RedirectToAction("Index", new { id = oLevel.AID });
}
}
db.OL.Add(oLevel);
db.SaveChanges();
return RedirectToAction("Index", new { id = oLevel.AID });
}
return View(oLevel);
}
基本上,如果数据库中已存在PostPreID
为该特定日期为2的记录,则用户不应该能够在特定日期添加PostPreID
等于2的记录。当PostPreID
等于3时,逻辑相同。
我已调试,并在PostPreID
中为dt
输入了2和3日期,我知道数据库不包含这些记录,但由于某种原因,嵌套的if语句包含 .Any < / em>方法总是解析为true。
感谢任何帮助。
答案 0 :(得分:0)
这个问题似乎与DbFunctions.TruncateTime(x.Date)
有关。因此TruncateTime
会删除时间并只比较两个日期,例如:
'4/11/2016 12:48 PM' == '4/11/2016 6:37 AM'
将评估为真。这意味着无论时间如何,只要日期和ID相同 - .Any
将始终为真。