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
                   ));
    }
Esempio n. 2
0
    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();
    }
Esempio n. 3
0
        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);
            }
        }