2011-02-15 30 views
0

我有一個使用asp.net mvc創建的留言簿表單。 必須通過從下拉控件中選擇一個值來填寫有效的gender表單字段。下拉控制有三個選項,即「 - 選擇 - 」,「女性」,「男性」以及默認選擇「 - 選擇 - 」。數據模型已設置爲強制訪問者選擇女性或男性,但不是「 - 選擇 - 」。Can DataAnnotation是否可以阻止用戶發佈數據庫中不存在的表單域?

我們知道訪問者有機會調節表單數據,因此他可以提交gender表單字段,指向數據庫中不存在的值。

我的問題是:

  1. 能DataAnnotation防止用戶發佈中不存在數據庫表單域?
  2. 對付這種嘗試的首選方法是什麼?在調用SaveChanges()之前,我必須先檢查提交的性別表單字段嗎?

回答

1

這取決於您是否需要爲用戶提供特定錯誤或乾淨的驗證消息。在用戶試圖篡改表單帖子的情況下,我不會太在意用戶體驗。

如果你關心這個,你可以使用IValidatableObject接口反對的合法值進行驗證:

public class Person : IValidatableObject 
{ 
    public string Gender { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     //ValidGenders is a list of valid values, retrieved from the database 
     if (!ValidGenders.Contains(Gender)) 
     { 
      yield return new ValidationResult("Gender is not valid", new string[] { "Gender" }); 
     } 
    } 
} 

模型驗證只是因爲它不使用數據註釋驗證使用IValidatableObject執行驗證。另一方面,如果您不關心用戶體驗,則可以讓錯誤在數據庫中發生,並使用標準錯誤處理管道處理問題。假設您的外鍵約束已到位,則該操作將失敗,因爲性別值在Genders表中找不到,或者無論您的設置是什麼。

+0

這是「便宜」?根據數據庫中的查找表驗證發佈的性別,然後在驗證失敗或讓數據庫拋出異常時手動拋出異常? – xport 2011-02-15 09:01:38

0

不確定您是否使用任何形式的DTO或業務對象,但除了驗證對象客戶端(或MVC內)之外,也可能讓對象也驗證自己。

通過這種方式,您可以在碰到數據庫之前發現任何問題。關於這個話題的一個有趣的帖子可以在這裏找到:Should Business Objects or Entities be Self-Validated?

相關問題