我想要实现的目标
所以我有一个viewmodel,它包含一个包含Questions列表的对象。我想在问题上验证一个属性,如果问题上的另一个对象(在本例中是一个列表)为null,那么该属性的验证应该失败。
我已经实现了服务器端部分,它完美无缺。 ObjectInstance是一个问题,我可以从中检索我的其他属性。
然而,对于客户端,我没有对象实例可以使用。相反,我有容器和容器类型。容易吗?它们看起来与对象实例相同,所以我可以使用它们。 ContainerType的类型是Question,但Container本身是我的ViewModel实例。这让我感到茫然。我已查看了元数据,并且已在互联网上搜索了几个小时,但我无法找到检索对象实例的方法。
问题
所以我的问题是,如何检索我的对象实例,还是可以用其他方式验证我的要求?
IsValid方法
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var containerType = validationContext.ObjectInstance.GetType();
var field = containerType.GetProperty(_otherProperty);
if (field != null)
{
var otherProperty = field.GetValue(validationContext.ObjectInstance);
var option = Convert.ToString(value);
if (otherProperty == null)
{
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
return ValidationResult.Success;
}
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
GetClientValidationRules方法
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
//var depProp = metadata.ContainerType.GetProperty(_otherProperty).GetValue(metadata.Container);
var rule = new ModelClientValidationRule();
rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
rule.ValidationParameters.Add("otherproperty", depProp);
rule.ValidationType = "requiredifempty";
yield return rule;
}
自定义jQuery验证
if (jQuery.validator && jQuery.validator.unobtrusive) {
jQuery.validator.unobtrusive.adapters.addSingleVal("requiredifempty", "otherproperty");
jQuery.validator.addMethod("requiredifempty", function (value, element, requiredifempty) {
if (requiredifempty === null || requiredifempty === '') {
return false;
}
return true;
});
}