Установите по умолчанию для DisplayFormatAttribute.ConvertEmptyStringToNull значение false

Я только что преобразовал кучу веб-сервисов в Web API2. Теперь мой код C# взрывается, когда браузер отправляет пустую строку и вводит мой код, преобразованный в null. Я исследовал глобальные решения, и ни одно из них не подошло мне.

Я, конечно, могу установить его вручную для каждой строки во всех моих моделях веб-API, но у меня множество моделей, поэтому я бы предпочел глобальное решение.

Был здесь: string.empty преобразован в null при передаче объекта JSON в контроллер MVC и другие страницы и пытался реализовать каждое решение, но безрезультатно.

Как я могу глобально установить значение по умолчанию для ConvertEmptyStringToNull в false?


person Reid    schedule 01.12.2013    source источник
comment
Вы нашли решение этой проблемы?   -  person QFDev    schedule 05.06.2015
comment
Нет. Я установил его везде вручную.   -  person Reid    schedule 08.06.2015
comment
Я нашел это решение: puredotnetcoder.blogspot.co.uk/2013 /09/   -  person CapIsland    schedule 28.10.2015


Ответы (2)


Вам нужно заменить ModelMetadataProvider на тот, который устанавливает ConvertEmptyStringToNull на false

Такие как:

public class EmptyStringAllowedModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
    protected override CachedDataAnnotationsModelMetadata CreateMetadataFromPrototype(CachedDataAnnotationsModelMetadata prototype, Func<object> modelAccessor)
    {
        var metadata = base.CreateMetadataFromPrototype(prototype, modelAccessor);
        metadata.ConvertEmptyStringToNull = false;
        return metadata;
    }

    protected override CachedDataAnnotationsModelMetadata CreateMetadataPrototype(IEnumerable<Attribute> attributes, Type containerType, Type modelType, string propertyName)
    {
        var metadata = base.CreateMetadataPrototype(attributes, containerType, modelType, propertyName);
        metadata.ConvertEmptyStringToNull = false;
        return metadata;
    }
}

Вы должны зарегистрироваться в своем WebApiConfig, например:

config.Services.Replace(typeof(ModelMetadataProvider), new EmptyStringAllowedModelMetadataProvider());

Это было вдохновлено https://gist.github.com/nakamura-to/4029706

person Brett Veenstra    schedule 11.04.2016

вы можете попробовать шаблон Aspect с помощью Postsharp и объявить ниже Aspect.
Он будет применяться ко всему решению. Работал на меня.

using System;
using System.Linq;
using System.Reflection;
using Helpers.Aspects;
using PostSharp.Aspects;
using PostSharp.Extensibility;

[assembly: EmptyStringModelBindingAspect(
    AttributeTargetTypes = @"regex:[^\.]*\.Controllers\..*Controller",
    AttributeTargetTypeAttributes = MulticastAttributes.Public,
    AttributeTargetElements = MulticastTargets.Method,
    AttributeTargetMemberAttributes = MulticastAttributes.Public)]

namespace Helpers.Aspects
{
    [Serializable]
    public class EmptyStringModelBindingAspect : MethodInterceptionAspect
    {
        public override void OnInvoke(MethodInterceptionArgs args)
        {
            for (int i = 0; i < args.Arguments.Count; i++)
            {
                FixString(args, i);
                FixStringsInObjects(args.Arguments[i]);
            }

            args.Proceed();
        }

        private static void FixString(MethodInterceptionArgs args, int i)
        {
            if (args.Arguments[i] is string && args.Arguments[i] == null)
            {
                args.Arguments.SetArgument(i, string.Empty);
            }
        }

        private static void FixStringsInObjects(object obj)
        {
            if (obj == null)
            {
                return;
            }

            var type = obj.GetType();
            var properties = (from p in type.GetProperties() 
                                         let paramerers = p.GetIndexParameters() 
                                         where !paramerers.Any() 
                                         where p.PropertyType == typeof (string) && 
                                               p.CanRead && 
                                               p.CanWrite && 
                                               p.GetValue(obj, null) == null 
                                         select p).ToArray();

            foreach (var item in properties)
            {
                item.SetValue(obj, string.Empty, null);
            }
        }

        public override bool CompileTimeValidate(MethodBase method)
        {
            return !(method.Name.StartsWith("get_") || method.Name.StartsWith("set_"));
        }
    }
}
person Phong Lu    schedule 14.07.2015