2011-11-04 15 views
6

Sto tentando di accedere al valore di un'altra proprietà dal metodo GetClientValidationRules di un attributo di convalida personalizzato.Ottieni il valore di un'altra proprietà da ModelMetaData

Ecco il mio tentativo (sulla base di Darin's response su un'altra questione):

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

Tuttavia, quando si cerca di impostare otherValue, ottengo:

System.Reflection.TargetException: oggetto non lo fa abbinare il tipo di bersaglio.

+0

come hai risolto questa cosa. Sto avendo lo stesso problema, qualche suggerimento? – TechnicalSmile

+0

ciao per caso potresti risolvere questo problema per favore? Sto avendo lo stesso problema per favore? – duongthaiha

risposta

7

Il problema è che non si sta passando il modello associato. Modificare le seguenti due righe:

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

questo otterrà i metadati completo (compresi i valori legati) rispetto al modello attuale.

+0

Grazie, ma ho ancora problemi. Guarda il mio esempio aggiornato nel mio OP - dove è impostato 'var otherValue = otherProperty.Model;', sto ricevendo "System.Reflection.TargetException: Object non corrisponde al tipo di target.". –

+0

Il problema con quella linea è che 'var' è per tipi impliciti, che non include oggetti. Cambia la riga in 'var otherValue = otherProperty.Model.ToString();' – counsellorben

+0

No, l'errore viene generato quando si valuta 'otherProperty.Model' - quindi fallisce prima che io possa anche fare' ToString() '. –

2

@JeradRose, il problema con il vostro TargetException è a causa di questa linea:

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

ParentType deve essere context.Controller.ViewData.Model.GetType().

Probabilmente l'hai già risolto, ma l'ho appena ricevuto oggi.

Problemi correlati