TryValidateModel
方法只下降一個級別,因此它僅在B
類型的對象上檢查Validation
屬性,而不在其嵌套對象上。克服這個的一種方法是定義自己的實施ValidationAttribute
的:
public class ListValidationAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
IEnumerable enumerable = value as IEnumerable;
// If the input object is not enumerable it's considered valid.
if (enumerable == null)
{
return true;
}
foreach (object item in enumerable)
{
// Get all properties on the current item with at least one
// ValidationAttribute defined.
IEnumerable<PropertyInfo> properties = item.GetType().
GetProperties().Where(p => p.GetCustomAttributes(
typeof(ValidationAttribute), true).Count() > 0);
foreach (PropertyInfo property in properties)
{
// Validate each property.
IEnumerable<ValidationAttribute> validationAttributes =
property.GetCustomAttributes(typeof(ValidationAttribute),
true).Cast<ValidationAttribute>();
foreach (ValidationAttribute validationAttribute in
validationAttributes)
{
object propertyValue = property.GetValue(item, null);
if (!validationAttribute.IsValid(propertyValue))
{
// Return false if one value is found to be invalid.
return false;
}
}
}
}
// If everything is valid, return true.
return true;
}
}
現在List<A>
可以使用屬性進行驗證:
public class B
{
[ListValidation]
public List<A> Values { get; set; }
}
我沒有爲上述方法測試表現得淋漓盡致,但如果在你的情況下,這是一個問題,另一種方法是使用助手功能:
if (!ValidateB(instanceofB))
{
//this should fire, as one of A inside B isn't valid.
return View(instanceofB);
}
...
public bool ValidateB(B b)
{
foreach (A item in b.Values)
{
if (!TryValidateModel(item))
{
return false;
}
}
return true;
}
將此標記爲現在的正確答案...理想情況下,希望讓孩子標記適當的模型狀態錯誤,但現在用手執行孩子錯誤... – Tracker1 2011-02-13 15:36:40
@Jeroen:你能告訴我你是如何學習TryValidateModel只能在一個層次而不是在子項目上工作的事實? – DavidS 2011-11-16 16:39:54
@DavidS:使用類瀏覽器(Reflector,IL Spy)進行檢查。 – Jeroen 2011-11-16 17:17:19