我有一個用戶添加的「標識」屬性,不需要重複。 (與數據庫ID不同)。編輯模型時忽略特定屬性的重複檢查
我已經添加下面的方法到我的視圖模型:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
GearContext db = new GearContext();
if (db.Items.Where(p => p.Identification == this.Identification).Count() > 0)
{
yield return new ValidationResult("Identification already in use, please chose a different one. ", new[] { "Identification" });
}
}
的問題是,這樣可以防止我編輯我的模型。我希望只有在創建新條目時纔會進行驗證,而不是編輯。
我曾嘗試以下類型的編輯在我的控制器:
if (ModelState.IsValid)
{
var item = db.Items.Find(viewModel.ItemId);
Mapper.Map<ItemViewModel, Item>(viewModel, item);
if (TryUpdateModel(item, null, null, new string[] { "Identification" }))
{
db.SaveChanges();
return RedirectToAction("Index");
}
}
也試過沒有「TryUpdateModel」在所有(簡單視圖模型=>模型和db.save)。
我想過在我的數據庫上下文中實現驗證方法,並只在item.State == EntityState.Added上運行它,但我相信我沒有訪問編輯過的模型屬性。
將標識作爲相關表的唯一鍵的一部分並不容易,並將所有這些留給DBMS?即使你在MVC中實現這一點,控制檯應用程序或Windows服務仍然可以打破這種邏輯。把它放在db裏意味着什麼都不可能。 – barrick
是否有可能首先用代碼定義唯一密鑰?另外,我不會有同樣的問題?我覺得這是我更新我的模型的方式,這可能是錯誤的(它根本不應該觸摸標識/標識)。 –
以前肯定是不可能的;你不妨檢查一下EF6是否已經改變了。但是,要保留在MVC中,你有獨立的創建和編輯視圖嗎?推測如此。如果是這樣,請爲每個視圖分別提供不同的視圖模型,並在相關的GET請求進入時使用控制器創建這些實例。然後,Create模型可以包含此驗證,而Edit模型可以將此作爲不可變屬性,因此不會需要檢查。 – barrick