[HttpPost]
public ActionResult Edit(Car car)
{
if (ModelState.IsValid)
{
db.Entry(car).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(car);
}
这是MCV 4搭建的控制器方法 我的“汽车”实体有一个独特的领域:LicensePlate。 我在我的实体上进行了自定义验证:
验证:
public partial class Car
{
partial void ValidateObject(ref List<ValidationResult> validationResults)
{
using (var db = new GarageIncEntities())
{
if (db.Cars.Any(c => c.LicensePlate.Equals(this.LicensePlate)))
{
validationResults.Add(
new ValidationResult("This licenseplate already exists.", new string[]{"LicensePlate"}));
}
}
}
}
它应该是有用的,我的汽车实体:
public partial class Car:IValidatableObject
{
public int Id { get; set; }
public string Color { get; set; }
public int Weight { get; set; }
public decimal Price { get; set; }
public string LicensePlate { get; set; }
public System.DateTime DateOfSale { get; set; }
public int Type_Id { get; set; }
public int Fuel_Id { get; set; }
public virtual CarType Type { get; set; }
public virtual Fuel Fuel { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var result = new List<ValidationResult>();
ValidateObject(ref result);
return result;
}
partial void ValidateObject(ref List<ValidationResult> validationResults);
}
每当我编辑汽车时,都会引发错误:
一个或多个实体的验证失败。看到 'EntityValidationErrors'属性以获取更多详细信息。
错误是我的验证引发的错误,说它无法编辑,因为已经有一辆带有该牌照的汽车。
如果有人能指出我正确的方向来解决这个问题,那就太棒了! 我搜索但找不到任何东西,所以即使是相关的帖子也欢迎!
注意:此字段具有唯一约束,因此必须仍然为创建操作触发此验证
答案 0 :(得分:0)
好吧我找到了解决办法,但我不确定它是有史以来最好的。 我修改了验证,以便它只在Id非exresnd时触发(所以.. 0)。 通过这种方式,我可以在新实体和更新实体之间产生干扰。
if (db.Cars.Any(c => c.LicensePlate.Equals(this.LicensePlate) && c.Id != this.Id))
这确实解决了我的问题,但不知怎的,我认为应该有一个更清洁的解决方案。