如何最好地显示 web api 和客户端之间的格式化属性

问题描述

我正在将一个 MVC 5 电子商务项目转换为使用 WEB API 服务,以便为其开发移动应用程序。我需要有关如何最好地处理产品价格的建议。 在当前的 mvc 应用中,displayFormat 属性工作得很好。

[displayFormat(DataFormatString = "{0:C}",ApplyFormatInEditMode = false,NulldisplayText = "-")]
public decimal Price { get; set; }

以上按预期显示货币(例如 $200.29),但这在 web api 中似乎不起作用。它只返回十进制的价格数字。现在所有的业务逻辑都存在于 api 中。 现在我的问题:有没有办法直接从 api 以格式化类型(即显示为货币,例如 $200.29)发送这种货币,这样我就不必在所有将使用 api 的客户端中处理格式,例如手机和网络? 要么 我必须处理所有客户端的格式?

解决方法

您可以编写一个转换器并附加为属性,以便在反序列化过程中,数据按照 Converter 中定义的格式返回。

例如下面的类表示将十进制转换为货币格式

internal class CurrencyConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(decimal) || objectType == typeof(decimal?));
    }

    public override object ReadJson(JsonReader reader,Type objectType,object existingValue,JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer,object value,JsonSerializer serializer)
    {
        Decimal? d = value as decimal?;
        JToken.FromObject(string.Format("{0:C}",d.GetValueOrDefault())).WriteTo(writer);
    }
}

现在上面的转换器可以应用于属性

public class Order
{
    public string Item {get; set;}
    
    [JsonConverter(typeof(CurrencyConverter))]
    public decimal Price {get; set;}
}

当WebApi返回响应时,物业价格将是如下所示的货币格式

{"Item":"Some Item","Price":"$2.34"}

你可以参考这个 dotnet fiddle - https://dotnetfiddle.net/c5FTDz