gpt4 book ai didi

c# - 如何为 body 模型上的属性提供自定义模型 Binder ?

转载 作者:行者123 更新时间:2023-11-30 12:38:17 24 4
gpt4 key购买 nike

我在为 ASP.NET Core 2.1 Web API 服务编写自定义模型绑定(bind)程序时遇到问题。我有一个像下面这样的 Action 方法

public async Task<IActionResult> SaveAccountEvents([FromRoute] Guid accountId, IList<AccountEvent> events)
{
}

AccountEvent 类有一堆属性,包括

[BindProperty(BinderType = typeof(CustomBinding))]
public string EventBody { get; set; }

目的是我希望来自客户端的此属性的值是字符串或 JObject (JSON)。这个想法是,客户端可以在 EventBody 中发送字符串化的 JSON 或 JSON,模型会将其存储为字符串 - 最终作为字符串化的 JSON。

我遇到的问题是,在我的自定义绑定(bind)中,bindingContext.ValueProvider.GetValue 从不返回任何内容。查看该属性,它只包含一个 RouteValueProvider。我看不出有什么方法可以从 body 中获取值(value)。有没有其他方法可以在 ASP.NET Core Web API 中自定义 JSON 反序列化?

更新:

客户端使用此 API 发送事件数据。事件数据由一个信封组成,其中包含事件名称、发送日期、发起事件的用户等。在当前版本中,实际事件数据作为字符串化 JSON 发送。所以现在,一个请求看起来像(注意事件主体是一个字符串):

{
"eventDate": "20180909",
"eventBody": "{
\"newLastName\": \"bob\",
\"primaryApplication\": \"bob\"
}"
}

变化是我希望能够接受事件主体作为 JSON。在这种情况下,客户端应该能够发送(注意事件主体是正确的 JSON):

{
"eventDate": "20180909",
"eventBody": {
"newLastName": "bob",
"primaryApplication": "bob"
}
}

这两种场景都需要支持,现有的API是字符串版本。我想要做的是配置 API,以便如果发送的事件是 JSON 对象,它会在到达 Action 的模型中被字符串化。

最佳答案

感谢 Kirk 提供解决方案的指导。我最终完全跳过了模型绑定(bind)(耶!),并且能够使用属性上带有属性的自定义序列化程序实现我需要的功能:[JsonConverter(typeof(EventBodyJsonConverter))]。有了这个,我可以在 Action 中使用 [FromBody] 来获取内容感知绑定(bind)。

public class EventBodyJsonConverter : JsonConverter
{
private JsonSerializer _jsonSerializer;

public EventBodyJsonConverter()
{
_jsonSerializer = new JsonSerializer();
}

public override bool CanConvert(Type objectType) => objectType == typeof(string);

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartObject)
{
var eventJObject = _jsonSerializer.Deserialize<JObject>(reader);
return eventJObject.ToString();
}

if (reader.TokenType == JsonToken.String)
{
return reader.Value.ToString();
}

throw new Exception();
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{

}
}

关于c# - 如何为 body 模型上的属性提供自定义模型 Binder ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53662592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com