-- .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
}
}
}
效果如图: