2012-10-08 39 views
5

我正在使用其他自定義聯繫人模型類繼承的基礎聯繫人模型。防止繼承模型中的驗證屬性

public class BaseContactModel 
{ 
    [Required(ErrorMessage = "Firstname is required")] 
    public virtual string FirstName { get; set; } 
} 

基本聯繫人模型使用驗證屬性來標記屬性是必需的,但在某些情況下我想重寫或停止它。這是可能的嗎?

public class ContactModel : BaseContactModel 
{ 
    [NotRequired] 
    public override string FirstName { get; set; } 
} 

我試圖使用新的驗證屬性NotRequired剛剛返回true,但似乎屬性只是被疊起來那麼需要& NotRequired正在運行和驗證失敗。

在尋找解決方案(我找不到),我發現了一些無關的屬性有一個「繼承」屬性,但我不認爲這在本地驗證屬性在System.ComponentModel.DataAnnotations

這是一個失敗的原因嗎?我是否需要推出自己的版本來支持禁用繼承?任何幫助不勝感激。

回答

2

的情況下看到這個下面,我創建一個類Model從另一個BaseModel繼承,使用了新的關鍵字,然後驗證每個實例的一個。從我所看到的,他們都使用基本屬性。

爲了使驗證程序更加清晰,我添加了一個控制類ControlModel

class Program 
{ 
    static void Main(string[] args) 
    { 
     ValidationTest<Model>(); 
     ValidationTest<BaseModel>(); 
     ValidationTest<ControlModel>(); 

     Console.Read(); 
    } 

    private static void WriteAttributeInfo<T>() 
    { 
     Console.WriteLine(string.Concat(typeof(T), " attributes:")); 
     typeof(T).GetProperties().SelectMany(m => m.GetCustomAttributes(true)).Select(a => { Console.WriteLine(a); return a; }).ToList(); 
    } 

    private static void ValidationTest<T>() 
    { 
     object obj = Activator.CreateInstance<T>(); 
     Console.WriteLine(string.Concat(typeof(T), " test: isValid = ", Validator.TryValidateObject(obj, new ValidationContext(obj, serviceProvider: null, items: null), new List<ValidationResult>()))); 
    } 
} 

class ControlModel 
{ 
    public string FirstName { get; set; } 

    public string Email { get; set; } 
} 

class BaseModel 
{ 
    [RequiredAttribute] 
    public virtual string FirstName { get; set; } 

    [RequiredAttribute] 
    public virtual string Email { get; set; } 
} 

class Model : BaseModel 
{ 
    public new string FirstName { get; set; } 

    public new string Email { get; set; } 
} 

ConsoleApplication1.Model測試:的isValid =假

ConsoleApplication1.BaseModel測試:的isValid =假

ConsoleApplication1.ControlModel測試:的isValid =真

從這個例子,看起來你不能覆蓋/隱藏/忽略繼承的必需驗證n(還沒有嘗試過其他)屬性。

+0

我討厭回答和接受我自己的問題,但從上面的測試中,它似乎是什麼原始問題要求,不能 –

+0

這是否真的沒有解決方案? – Giorgio

0

這種情況可能是你真正想要一個新的屬性

public class ContactModel : BaseContactModel 
{ 
     [NotRequired] 
     public new string FirstName { get; set; } 
} 
+1

這是否替換屬性?我嘗試過使用新的(使用虛擬屬性),但它似乎仍然正在進行驗證。 –

+0

我過去曾多次使用過這個策略。它應該是一個全新的屬性,因此只有一個驗證屬性或另一個應該觸發。當然,這取決於如何聲明或使用模型變量來確定實際使用哪個屬性。如果它不工作,你可能想發佈一些控制器代碼,看看我們是否可以找出原因。 – dumdum

+0

感謝您的回覆,今晚我會再做一次努力,甚至有可能直接在網站上嘗試一個網站。 –