2011-11-04 15 views
6

获取他人财产的价值我想从自定义验证属性的GetClientValidationRules方法中获得他人财产的价值。从ModelMetaData

这是我尝试(基于Darin's response另一个问题):

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
    ModelMetadata metadata, ControllerContext context) 
{ 
    var parentType = metadata.ContainerType; 
    var parentMetaData = ModelMetadataProviders.Current 
     .GetMetadataForType(null, parentType); 

    var parentMetaData = ModelMetadataProviders.Current 
     .GetMetadataForProperties(context.Controller.ViewData.Model, parentType); 

    var otherProperty = parentMetaData.FirstOrDefault(p => 
     p.PropertyName == "SomeProperty"); 

    var otherValue = otherProperty.Model; 

    var rule = new ModelClientValidationRule 
    { 
     ValidationType = "customvalidatorattribute", 
     ErrorMessage = this.FormatErrorMessage(metadata.GetDisplayName()), 
    }; 

    yield return rule; 
} 

然而,试图设置otherValue的时候,我得到:

System.Reflection.TargetException:对象不匹配目标类型。

+0

你是如何得到这件事情解决。我有同样的问题,有什么建议吗? – TechnicalSmile

+0

嗨,你有什么机会解决这个问题吗?我有同样的问题吗? – duongthaiha

回答

7

的问题是,你是不是传入绑定模型。更改以下两行:

var parentMetaData = ModelMetadataProviders.Current 
    .GetMetadataForProperties(context.Controller.ViewData.Model, parentType); 
var otherValue = (string)parentMetaData.FirstOrDefault(p => 
    p.PropertyName == "SomeProperty").Model; 

这将让从当前模型全部元数据(包括边界值)。

+0

谢谢,但我仍然有问题。看到我更新的例子在我的OP - 它的设置'VAR otherValue = otherProperty.Model;',我得到“System.Reflection.TargetException:对象不匹配目标类型。” –

+0

该行的问题是'var'用于隐式类型,它不包含对象。该行更改为'无功otherValue = otherProperty.Model.ToString();' – counsellorben

+0

没有,评估'otherProperty.Model'当越来越抛出的错误 - 所以它的失败之前,我甚至可以做'的ToString()'。 –

2

@JeradRose,你TargetException问题是因为该行的:

var parentMetaData = ModelMetadataProviders.Current 
    .GetMetadataForProperties(context.Controller.ViewData.Model, parentType); 

ParentType的需要是context.Controller.ViewData.Model.GetType()

也许你已经解决了,但我今天刚拿到它。

相关问题