protected virtual object ConvertStringToPropertyType(ModelBindingContext bindingContext, string value) { if (bindingContext.ModelMetadata.ConvertEmptyStringToNull && string.IsNullOrWhiteSpace(value)) { return(null); } var extensionInfo = ObjectExtensionManager.Instance.GetOrNull(ExtensibleObjectType); if (extensionInfo == null) { return(value); } var propertyName = ExtraPropertyBindingHelper.ExtractExtraPropertyName(bindingContext.ModelName); if (propertyName == null) { return(value); } var propertyInfo = extensionInfo.GetPropertyOrNull(propertyName); if (propertyInfo == null) { return(value); } return(TypeHelper.ConvertFromString( propertyInfo.Type, value )); }
public void ExtractExtraPropertyName_Tests() { ExtraPropertyBindingHelper.ExtractExtraPropertyName( "MyObject.UserInfo.ExtraProperties[SocialSecurityNumber]" ).ShouldBe("SocialSecurityNumber"); ExtraPropertyBindingHelper.ExtractExtraPropertyName( "UserInfo.ExtraProperties[SocialSecurityNumber]" ).ShouldBe("SocialSecurityNumber"); ExtraPropertyBindingHelper.ExtractExtraPropertyName( "ExtraProperties[SocialSecurityNumber]" ).ShouldBe("SocialSecurityNumber"); ExtraPropertyBindingHelper.ExtractExtraPropertyName( "SocialSecurityNumber" ).ShouldBeNull(); }
protected virtual void AddExtraPropertyValidationsAttributes(ViewContext viewContext, ModelExplorer modelExplorer, IDictionary <string, string> attributes) { var nameAttribute = attributes.GetOrDefault("name"); if (nameAttribute == null) { return; } var extraPropertyName = ExtraPropertyBindingHelper.ExtractExtraPropertyName(nameAttribute); if (extraPropertyName == null) { return; } //TODO: containerName can be null on controller actions..? var containerName = ExtraPropertyBindingHelper.ExtractContainerName(nameAttribute); if (containerName == null) { return; } if (modelExplorer.Container?.ModelType == null) { return; } var extensibleObjectType = modelExplorer.Container.ModelType .GetProperty(containerName, BindingFlags.Instance | BindingFlags.Public) ?.PropertyType; if (extensibleObjectType == null) { return; } var extensionPropertyInfo = ObjectExtensionManager.Instance.GetPropertyOrNull( extensibleObjectType, extraPropertyName ); if (extensionPropertyInfo == null) { return; } if (modelExplorer.Metadata is DefaultModelMetadata metadata) { metadata.DisplayMetadata.DisplayName = () => extensionPropertyInfo.GetLocalizedDisplayName(_stringLocalizerFactory); } foreach (var validationAttribute in extensionPropertyInfo.GetValidationAttributes()) { var validationContext = new ClientModelValidationContext( viewContext, modelExplorer.Metadata, _metadataProvider, attributes ); if (validationAttribute.ErrorMessage == null) { ValidationAttributeHelper.SetDefaultErrorMessage(validationAttribute); } var validationAttributeAdapter = _validationAttributeAdapterProvider.GetAttributeAdapter( validationAttribute, _validationStringLocalizer ); validationAttributeAdapter?.AddValidation(validationContext); } }