2011-11-04 9 views
6

Estoy tratando de obtener el valor de otra propiedad desde el método GetClientValidationRules de un atributo de validación personalizado.Obtener el valor de otra propiedad de ModelMetaData

Aquí está mi intento (basado en Darin's response en otra pregunta):

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; 
} 

Sin embargo, al intentar establecer otherValue, me sale:

System.Reflection.TargetException: Objeto no lo hace coincide con el tipo de objetivo.

+0

cómo se resolvió esto. Estoy teniendo el mismo problema, ¿alguna sugerencia? – TechnicalSmile

+0

hola por casualidad usted resuelve este problema por favor? Estoy teniendo el mismo problema, por favor? – duongthaiha

Respuesta

7

El problema es que no está pasando en el modelo encuadernado. Cambie las dos líneas siguientes:

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

Esto hará que los metadatos completo (incluyendo los valores de la envolvente) del modelo actual.

+0

Gracias, pero todavía tengo problemas. Vea mi ejemplo actualizado en mi OP - donde está configurando 'var otherValue = otherProperty.Model;', obtengo "System.Reflection.TargetException: Object no coincide con el tipo de destino". –

+0

El problema con esa línea es que 'var' es para tipos implícitos, que no incluye objetos. Cambie la línea a 'var otherValue = otherProperty.Model.ToString();' – counsellorben

+0

No, el error se produce al evaluar 'otherProperty.Model' - por lo que está fallando antes de que pudiera hacer' ToString() '. –

2

@JeradRose, el problema con su TargetException es a causa de esta línea:

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

ParentType necesita ser context.Controller.ViewData.Model.GetType().

Probablemente ya lo haya solucionado, pero lo tengo hoy.

Cuestiones relacionadas