.Net Web Api中ModelMetadataProviders全局设置空字符串是否转null

-- .Net Web Api (或MVC)中通过定制模型绑定(ModelMetadataProviders)来全局设置空字符串是否转null
【官网】:https://docs.microsoft.com/en-us/dotnet/api/system.web.mvc.dataannotationsmodelmetadataprovider

应用场景

Asp .net MVC 2.0(及以上),通过在ModelMetadataProviders中设置处理 ConvertEmptyStringToNull,来全局设置api入参中的空字符串是否要转换为null.

基础资源

使用须知

实现 ASP.NET MVC 的默认模型元数据提供程序:ModelMetadataProviders是很强大,不但可以处理类似是否empty转null,还可以为模型中的字段属性增加关联的特性(比如页面的字段提示内容等).

配置步骤

常见问题

快速入门

A)设置MVC(或web api)中参数值为空时是否自动转化为null解决方案.

A1)局部设置.

    public class ArticleQueryModel
    {
       [DisplayFormat(ConvertEmptyStringToNull = false)] //单个指定,false表示不自动转换为null, 否则会自动转换
        public string ArticleId { get; set; }

        public short State { get; set; }

        public string Lable { get; set; }
    }

A2)全局设置。

如图所示:

模型元数据提供程序的代码如下

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace ConfigLab.MVCLab
{
    /// <summary>
    /// 创建人:配置啦--  http://config.net.cn
    /// 创建时间:2022-1-22
    /// 功能简介:设置参数模型的字段值为empty时是否自动转换为null
    /// </summary>
    public class CustomerModelMetaDataProvider : DataAnnotationsModelMetadataProvider
    {
        private readonly bool _convertEmptyStringToNull;
        public CustomerModelMetaDataProvider(bool convertEmptyStringToNull)
        {
            _convertEmptyStringToNull = convertEmptyStringToNull;
        }
        protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
        {
            var md = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);

            DataTypeAttribute dataTypeAttribute = attributes.OfType<DataTypeAttribute>().FirstOrDefault();
            DisplayFormatAttribute displayFormatAttribute = attributes.OfType<DisplayFormatAttribute>().FirstOrDefault();
            if (displayFormatAttribute == null && dataTypeAttribute != null)
            {
                displayFormatAttribute = dataTypeAttribute.DisplayFormat;
            }
            if (displayFormatAttribute == null)
            {
                md.ConvertEmptyStringToNull = _convertEmptyStringToNull;//false:不转换empty为null,  true:自动转换empty为null
            }
            return md;
        }
    }
}

Global.asax.cs中指定ModelMetadataProviders的代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace ConfigLab.MVCLab
{
    /// <summary>
    /// 创建人:配置啦--  http://config.net.cn
    /// 创建时间:2022-1-22
    /// </summary>
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            ModelMetadataProviders.Current =new CustomerModelMetaDataProvider(true);//全局指定一个模型元数据提供程序,设置是否empty转null
        }
    }
}

效果如图



参考资料