Asp.net-Mvc

使用數據註釋進行自定義驗證

  • October 10, 2013

我正在使用數據註釋來檢查正在輸入的數據,但是當涉及到更自定義的數據驗證方式時,我被卡住了。

我需要對數據庫執行查詢以查看那裡是否存在東西,然後在出現“自定義 db-check 錯誤”時向使用者報告,例如“公司名稱已存在”

如何與數據註釋一起實現這樣的事情?

我使用 3.5sp1 附帶的 linq 和實體框架完成了所有查詢等

/米

擴展數據註釋的自定義屬性

您將必須編寫自己的屬性,這些屬性將針對數據儲存驗證您的對象實例。

確保你的類繼承System.ComponentModel.DataAnnotations.ValidationAttribute類:

public class MustNotExist: ValidationAttribute
{
   ...
}

警告

當我需要驗證對像在數據儲存中是否唯一時,我遇到了類似的情況。但是這種驗證在實體類本身上是不可能的,因為它應該只適用於那些正在創建的實體,而不是當你已經從數據儲存中返回你的實體時。

我的解決方案是有一個單獨的介面、類和屬性。

public interface IExternalValidator ...

class DBUniqueValidator: IExternalValidator ...

class ValidateExternallyAttribute: FilterAttribute, IActionFilter
{
   ...
   public ValidateExternallyAttribute(Type validatorType, Type entityType) ...
   ...
}

我能夠將我的屬性放在獲取實體參數的控制器操作上。過濾器操作屬性然後檢查控制器操作參數(它可以輕鬆訪問它們的類型和值)並針對正確的參數(屬性定義中提供的類型)執行外部驗證器,並在驗證失敗時填充 ModelState 錯誤。

[ValidateExternally(typeof(DBUniqueValidator), typeof(User))]
public ActionResult RegisterUser(User newUser)
{
   if (!this.ModelState.IsValid)
   {
       // act accordingly - probably return some error depending on model state errors
   }
   // register new user in data store
}

通過這種方式,我能夠只對那些真正需要它的操作執行外部驗證,而且這種技術還幫助我的控制器操作程式碼保持簡潔。我所要做的就是檢查是否有任何模型狀態錯誤。

引用自:https://stackoverflow.com/questions/1905777