You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Web API 2中移除DateTime的T字符及优化Null值显示咨询

ASP.NET Web API 2 日期格式化与Null值处理方案

一、先修正数据读取的潜在问题

你的原代码存在两个明显问题:

  1. UserId在返回结果中是字符串类型(如ABC001),但代码里用Convert.ToInt32转换,会直接抛出异常,需改为字符串类型处理。
  2. 数据库中Date和Access存在Null值,直接用Convert.ToDateTime/Convert.ToInt32会报错,需将实体类对应字段改为可空类型,并添加Null判断。

修正后的实体类

public class TestClass
{
    public string UserId { get; set; }
    public string Name { get; set; }
    public string Mobile { get; set; }
    public int? Access { get; set; } // 改为可空int类型
    public DateTime? Date { get; set; } // 改为可空DateTime类型
}

修正后的数据读取逻辑

while (sdr.Read())
{
    draft.Add(new TestClass()
    {
        UserId = sdr.IsDBNull(0) ? null : sdr.GetString(0),
        Name = sdr.IsDBNull(1) ? string.Empty : sdr.GetString(1),
        Mobile = sdr.IsDBNull(2) ? string.Empty : sdr.GetString(2),
        Access = sdr.IsDBNull(3) ? (int?)null : sdr.GetInt32(3),
        Date = sdr.IsDBNull(4) ? (DateTime?)null : sdr.GetDateTime(4)
    });
}

二、移除DateTime中的T字符

Web API默认XML序列化会输出ISO8601格式的日期(带T分隔符),以下两种方法可自定义日期格式:

方法1:通过DataContractSerializer配置日期格式

给实体类添加DataContract和DataMember特性,指定日期格式:

using System.Runtime.Serialization;

[DataContract]
public class TestClass
{
    [DataMember]
    public string UserId { get; set; }
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string Mobile { get; set; }
    [DataMember(EmitDefaultValue = false)]
    public int? Access { get; set; }
    [DataMember(EmitDefaultValue = false)]
    [DataFormat(DataFormatString = "yyyy-MM-dd HH:mm:ss")]
    public DateTime? Date { get; set; }
}

然后在WebApiConfig.cs中配置使用DataContractSerializer:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var xmlFormatter = config.Formatters.XmlFormatter;
        xmlFormatter.UseXmlSerializer = false; // 启用DataContractSerializer
        xmlFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("application/xml"));
    }
}

方法2:自定义XmlTextWriter处理日期格式

如果偏好使用XmlSerializer,可创建自定义写入器替换T为空格:

public class CustomXmlTextWriter : System.Xml.XmlTextWriter
{
    public CustomXmlTextWriter(System.IO.TextWriter writer) : base(writer) { }

    public override void WriteString(string text)
    {
        if (System.DateTime.TryParse(text, out System.DateTime date))
        {
            base.WriteString(date.ToString("yyyy-MM-dd HH:mm:ss"));
        }
        else
        {
            base.WriteString(text);
        }
    }
}

在WebApiConfig.cs中配置格式化器:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var xmlFormatter = config.Formatters.XmlFormatter;
        xmlFormatter.SetSerializer<TestClass>(new System.Xml.Serialization.XmlSerializer(typeof(TestClass)));
        xmlFormatter.CreateXmlWriter = (stream, encoding) => new CustomXmlTextWriter(new System.IO.StreamWriter(stream, encoding));
    }
}

三、优化Null值的显示格式

根据你的需求,提供两种实现方式:

选项1:显示为空标签(
return (<Date></Date>)
)

将实体类中Date和Access改为字符串类型,读取数据时直接转换为字符串或空值:

public class TestClass
{
    public string UserId { get; set; }
    public string Name { get; set; }
    public string Mobile { get; set; }
    public string Access { get; set; }
    public string Date { get; set; }
}

读取逻辑调整:

while (sdr.Read())
{
    draft.Add(new TestClass()
    {
        UserId = sdr.IsDBNull(0) ? null : sdr.GetString(0),
        Name = sdr.IsDBNull(1) ? string.Empty : sdr.GetString(1),
        Mobile = sdr.IsDBNull(2) ? string.Empty : sdr.GetString(2),
        Access = sdr.IsDBNull(3) ? string.Empty : sdr.GetInt32(3).ToString(),
        Date = sdr.IsDBNull(4) ? string.Empty : sdr.GetDateTime(4).ToString("yyyy-MM-dd HH:mm:ss")
    });
}

选项2:显示为
return (<Date>null</Date>)

同样将字段改为字符串类型,读取时给Null值赋值"null":

Date = sdr.IsDBNull(4) ? "null" : sdr.GetDateTime(4).ToString("yyyy-MM-dd HH:mm:ss");
Access = sdr.IsDBNull(3) ? "null" : sdr.GetInt32(3).ToString();

如果要保留可空值类型,可结合之前的自定义CustomXmlTextWriter,修改写入逻辑:

public override void WriteString(string text)
{
    if (string.IsNullOrEmpty(text) || text == "null")
    {
        base.WriteString("null");
    }
    else if (System.DateTime.TryParse(text, out System.DateTime date))
    {
        base.WriteString(date.ToString("yyyy-MM-dd HH:mm:ss"));
    }
    else
    {
        base.WriteString(text);
    }
}

同时给实体类属性添加XmlElement(IsNullable = true)特性:

using System.Xml.Serialization;

public class TestClass
{
    public string UserId { get; set; }
    public string Name { get; set; }
    public string Mobile { get; set; }
    [XmlElement(IsNullable = true)]
    public int? Access { get; set; }
    [XmlElement(IsNullable = true)]
    public DateTime? Date { get; set; }
}

内容的提问来源于stack exchange,提问作者user27429245

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 09:33:21