2010-03-23 30 views
2

我們試圖獲得一個條件屬性來工作,例如,有一個布爾(複選框),如果選中,則需要其相關文本。所以,理想情況下,我們會有類似...用於驗證的條件所需屬性

public bool Provision { get; set; } 

[ConditionalRequirement(IsNeededWhenTrue = Provision)] 
public string ProvisionText { get; set; } 

這甚至有可能嗎?

備用想法(不優雅?)

public bool Provision2 { get; set; } 

    [PropertyRequired(RequiredBooleanPropertyName = "Provision2")] 
    public string Provision2Text { get; set; } 

我討厭使用魔法字符串的方法......但任何其他的想法?

回答

0

完成滾動我自己的。基本上你創建了一個valiation方法,它可以對yes,no,any進行正常檢查,並在某種錯誤收集中收集它們。與此擦擦就是把它送回模型本身。所以我就偷懶強類型它是這樣......

public static void AddError<T>(this ErrorCollection errorCollection, Expression<Func<T, object>> expression, string friendlyUiName) 
{ 
    var propertyName = GetPropertyName(expression.ToString(), expression.Parameters[0].Name); 
    var propertyInfo = typeof (T).GetProperty(propertyName); 
    var resultError = DetermineOutput(friendlyUiName, propertyInfo.PropertyType); 
    errorCollection.Errors.Add(new ValidationError(propertyName, resultError)); 
} 

,那麼你是驗證報表有這樣的事情在他們...

if (FirstName.IsEmpty()) 
     EntityErrorCollection.AddError<SomeClass>(x => x.FirstName, "First Name"); 

然後在控制器內,一個簡單的檢查和端口回模型,如果它(是不是有效的,當然)...

foreach (var error in someObject.EntityErrorCollection.Errors) 
     ModelState.AddModelError(error.Property, error.Message); 

有可能這樣做的更清潔的方式,但到目前爲止,這一直工作得很好。