有一類(精簡版):在運行時服務器端驗證添加ValidationAttribute取決於另一個容器屬性
public class Parameter
{
public Guid Id { get; set; }
public decimal Value { get; set; }
}
在我看來,我有參數的字典,他們得到呈現:
<input ... name="Parameters[3].Key" type="hidden" value="UniqueParamName" />
<input ... name="Parameters[3].Value.Id" type="hidden" value="395816ad-dfde-11e1-8c36-848f69f05f09" />
<input ... name="Parameters[3].Value.Value" type="text" value="75" />
驗證規則將由用戶通過一些GUI設置並存儲在數據庫中。 我想從Parameter.Id
的Parameter.Value
數據庫中獲得ValidationAttribute
s,但是我看不到任何做法。 我也嘗試添加ModelMetadataProvider.CreateMetadata
中的屬性,其中容器可以通過一些[討厭的]反射來訪問,但是當爲「值」創建元數據時(尚不可靠),「Id」還沒有被分配。 也許我太過於複雜,我只想堅持內置的驗證。
public class ExtendedValidationProvider : DataAnnotationsModelValidatorProvider
{
protected override IEnumerable<ModelValidator> GetValidators(
ModelMetadata metadata,
ControllerContext context,
IEnumerable<Attribute> attributes)
{
if (metadata.ContainerType == typeof(Parameter)
&& metadata.PropertyName == "Value")
{
Guid parameterId = <some magic code>;
IEnumerable<Attribute> validationAttributes
= db.GetValidationAttributesByParameterId(parameterId);
return base.GetValidators(metadata, context, validationAttributes);
}
return Enumerable.Empty<ModelValidator>();
}
}
我的驗證規則是通過用戶界面來設置後來從數據庫加載,這就是爲什麼我題目用語言這個問題「在運行時「。猜猜我應該說清楚。 – rgripper 2012-08-15 20:55:59
是的,這仍然適用。您仍然可以編寫一個ValidationAttribute來完成自定義驗證規則查找(從數據庫等),然後將此自定義屬性放置在您的模型上。 – Sean 2012-08-15 22:00:19
我不能把它放在我的模型上,因爲你建議每個類型的基礎上,我需要它不同的'參數'的每個實例, – rgripper 2012-08-16 16:05:33