2016-05-31 48 views
0

模型的屬性:驗證消息不表示用於子類的模型

public class Person : IValidatableObject 
{ 
    public Address ResidentialAddress { get; set; } 
    public Address PostalAddress { get; set; } 
} 

public class Address 
{ 
    public string Address1 { get; set; } 
} 
在模型

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
{ 
    if (string.IsNullOrWhiteSpace(PostalAddress.Address1)) 
    { 
      yield return 
        new ValidationResult("Postal address is required", 
         new[] { nameof(PostalAddress.Address1) }); 
    } 
} 

檢視:(用於地址的信息查看人內部的局部視圖)

@Html.ValidationMessageFor(m => m.Address1) 

在html中出現這個名字PostalAddress.Address1和編號PostalAddress_Address1

不幸的是nameof(PostalAddress.Address1)只是返回Address1

我試過用PostalAddress.Address1PostalAddress_Address1代替它,並且無法顯示錯誤。

什麼是祕密?

+0

您的模型需要實現'IValidatableObject' –

+0

Person實際上是一個視圖模型,它的簡化問題。驗證正在工作,我只想知道如何獲取顯示的錯誤... – stuartdotnet

回答

0

我覺得@MikeDebela是正確的在您的答案下面的評論。如果您要使用自定義模型驗證,則您的模型需要實現IValidatableObject。但是,這不是你唯一的問題。

首先,是否有一個特殊的原因,你不只是依靠[Required]屬性呢?自定義模型驗證對於簡單的事情來說有點浪費。如果問題在於這是您的實際實體類,並且您不希望Address1列在數據庫級別不可爲空,那麼這就是視圖模型的用途。使用它們。您可以根據您的視圖模型製作所需的屬性。作爲一種最佳實踐,您絕不應該直接利用實體類來發布信息。

此外,你從來沒有新興PostalAddress。當模型聯編程序在後期完成它的工作時,如果沒有發佈相關類的屬性,則它會將相關類的值保留爲null。然後,任何相關的類爲null的類也不會被驗證。因此,如果唯一的財產是Address1並且您沒有發佈Address1,那麼PostalAddressnull,並且其上沒有任何財產,特別是Address1將參與驗證。

+0

我不能使用Required屬性,因爲它並不總是必需的,PostalAddress.Address1僅在沒有設置ResidentialAddress.Address1時才需要。 – stuartdotnet

+0

我不是在控制數據庫 – stuartdotnet

+0

另外我正在實施:IValidatableObject,但忘了將它添加到示例代碼對不起 – stuartdotnet