Get a different property value from ModelMetaData

I am trying to get a different property value from the GetClientValidationRules method of a special validation attribute.

Here is my attempt (based on Darin's answer on another question):

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

However, when I try to set otherValue I get:

System.Reflection.TargetException: The object does not match the type of target.

+6
source share
2 answers

The problem is that you are not passing in a linked model. Change the following two lines:

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

This will result in complete metadata (including related values) from the current model.

+7
source

@JeradRose The problem with your TargetException is related to this line:

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

parentType must be context.Controller.ViewData.Model.GetType() .

You may have already fixed it, but I just received it today.

+2
source

Source: https://habr.com/ru/post/900805/


All Articles