【问题标题】:Set default for DisplayFormatAttribute.ConvertEmptyStringToNull to false将 DisplayFormatAttribute.ConvertEmptyStringToNull 的默认值设置为 false
【发布时间】:2013-12-16 23:23:53
【问题描述】:

我刚刚将一堆 Web 服务转换为 Web API2。现在,当浏览器发送一个空字符串并输入我的转换为 null 的代码时,我的 C# 代码会爆炸。我研究了全球解决方案,但没有找到适合我的解决方案。

我当然可以为所有 Web API 模型中的每个字符串手动设置它,但我有很多模型,所以更喜欢全局解决方案。

到过这里:string.empty converted to null when passing JSON object to MVC Controller 和其他页面并尝试实施每个解决方案,但无济于事。

如何将 ConvertEmptyStringToNull 的默认值全局设置为 false?

【问题讨论】:

标签: c# asp.net-mvc-5 asp.net-web-api2


【解决方案1】:

您需要将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的启发

【讨论】:

  • 在 .NET Core 之前的 ASP.NET MVC(即System.Web.ModelBinding.DataAnnotationsModelMetadataProvider)中,您只需要覆盖CreateMetadata btw。
【解决方案2】:

您可以使用 Postsharp 尝试 Aspect 模式并在 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_"));
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多