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

asp.net-mvc data-annotations entity-framework

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

我需要對數據庫運行查詢以查看是否存在存在的東西,然後在出現“自定義數據庫檢查錯誤”時向用戶報告,例如“公司名稱已存在”

我如何與dataannotations一起實現這樣的東西?

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

/ M

一般承認的答案

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

您必須編寫自己的屬性,以對數據存儲進行對象實例的驗證。

確保您的類繼承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
}

這樣我就可以僅對那些實際需要它的動作運行外部驗證,這種技術也幫助我的控制器動作代碼保持乾淨和簡短。我所要做的就是檢查是否存在任何模型狀態錯誤。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow