c# - 如何最好地在 Web api 和客户端之间显示格式化属性

标签 c# asp.net json asp.net-mvc asp.net-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 的客户端中处理格式,例如移动和网络? 或者 我必须处理所有客户端中的格式?

最佳答案

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

例如,下面的类表示将小数转换为货币格式

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

关于c# - 如何最好地在 Web api 和客户端之间显示格式化属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65542020/

相关文章:

c# - 无法将类型 'double' 隐式转换为 'float'

json - Node.js中如何从json中分别获取key和value

c# - CaSTLe Windsor 如何运作?它是否包装了所有已注册的对象?

ASP.NET 5 OAuth 不记名 token 身份验证

c# - ASP.NET 用 html 数字替换双引号

javascript - 如何将点击的视频 block 打开到弹出模式?

html - JSON 中的 CSS 标签

c# - 看不到 DLL 中的类

c# - VS2005 : How to automatically generate a build number with date?

c# - 如何像签署程序集一样签署 ZIP 文件?