2013-12-01 4 views
11

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

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

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

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

+0

Вы нашли решение на эту проблему? – QFDev

+0

Нет. Я повредил его вручную. – Reid

+0

Я нашел это решение: http://puredotnetcoder.blogspot.co.uk/2013/09/convertemptystringtonull-in-mvc.html – CapIsland

ответ

0

вы можете попробовать шаблон аспект с помощью 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_")); 
     } 
    } 
} 
4

Вы должны поменять вне 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