2011-11-04 7 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

問題は、バインドされたモデルを渡していないことです。次の2行を変更します。

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:Object is not target type。" –

+0

その行の問題は 'var'は暗黙の型のためであり、オブジェクトは含まれていません。 '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()する必要があります。

おそらくあなたはすでにそれを修正しましたが、私は今それを入手しました。

関連する問題