2011-11-04 11 views
6

Próbuję uzyskać wartość innej usługi z metody GetClientValidationRules niestandardowego atrybutu sprawdzania poprawności.Uzyskaj wartość innej właściwości z ModelMetaData

Oto moja próba (na podstawie Darin's response na inne pytanie):

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

Jednak gdy próbuje ustawić otherValue, otrzymuję:

System.Reflection.TargetException: obiekt nie dopasuj typ celu.

+0

jak to rozwiązałeś. Mam ten sam problem, wszelkie sugestie? – TechnicalSmile

+0

Witam, jeśli tylko rozwiążesz ten problem, proszę? Mam taki sam problem, proszę? – duongthaiha

Odpowiedz

7

Problem polega na tym, że nie przekazuje się oprawionego modelu. Zmień następujące dwa wiersze:

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

Otrzyma pełne metadane (w tym powiązane wartości) z bieżącego modelu.

+0

Dzięki, ale nadal mam problemy. Zobacz mój zaktualizowany przykład w moim OP - gdzie to ustawienie 'var otherValue = otherProperty.Model;', otrzymuję "System.Reflection.TargetException: Object nie pasuje do typu target.". –

+0

Problem z tą linią polega na tym, że 'var' jest dla typów niejawnych, które nie zawierają obiektów. Zmień linię na 'var otherValue = otherProperty.Model.ToString();' – counsellorben

+0

Nie, błąd jest generowany podczas oceniania 'otherProperty.Model' - więc kończy się niepowodzeniem, zanim mogłem nawet wykonać' ToString() '. –

2

@JeradRose, problem z TargetException właśnie z powodu tej linii:

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

parentType musi być context.Controller.ViewData.Model.GetType().

Prawdopodobnie już to naprawiłeś, ale właśnie dostałem go dzisiaj.