2016-09-15 48 views
0

我有一個視圖模型如何驗證MVC5中繼承的View Model?

public class BaseFilter 
{ 
    public virtual string Field1 { get; set; } 
    public virtual DateTime? Field2 { get; set; } 
    public virtual string Field3 { get; set; } 
} 


public class TestFilter : BaseFilter, IValidatableObject 
{ 
    [Required] 
    public override string Field3 { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext context) 
    { 
     // Validation logic.. 
    } 
} 

在我看來,我現在用的TestFilter在特定視圖。

@model MyReportSite.Models.TestFilter 

但是,當我張貼在我的視圖中沒有我的驗證正在發生。
如何在繼承的ViewModel上使用驗證(DataAtrributes和IValidatableObject)?

編輯:澄清在控制器中我看到我的ViewModel字段開始填充,但缺少驗證。即必填字段未被強制執行,等等......

+0

當你說沒有驗證發生時,你的意思是沒有調用Validate()方法嗎?如果是這樣,可能是因爲驗證一個或多個字段或綁定失敗。驗證在幾個階段中工作,在IValidatableObject上調用Validate()方法取決於綁定和驗證屬性傳遞驗證規則。 – Luke

+0

Validate()方法未被調用。另外如果我用[Required]裝飾繼承類的屬性也被忽略。 – PrivateJoker

+0

好的。你發佈什麼數據到你的動作?它是否在帶有Field3字段的頁面上?該字段是空的,你正在提交表單?另外,你如何驗證你的屬性上的Required屬性被忽略? – Luke

回答

0

您必須在您的操作結果中引用您的派生類,因爲這是在模型綁定發生時將構建的模型。由於您的基類中沒有任何驗證屬性,因此您的屬性將不會在模型綁定過程中執行。

public ActionResult Index(TestFilter model) 
{ 
    // Correct, this model has validation attributes 
} 

public ActionResult Index(BaseFilter model) 
{ 
    // Incorrect, your base model doesn't have validation attributes 
}