【发布时间】:2022-02-05 19:02:35
【问题描述】:
我尝试在我的 HttpGet 路由中添加一个“自定义数据类型”的变量。
我有这个代码:
[HttpGet("{idObject}")]
public ResponseSchema Get(ObjectId idObject)
{
if (idObject == null) {
throw new BodyParseException();
}
var user = _usersLogic.GetById(idObject);
if (user == null) {
_response.Success = false;
_response.ErrorCode = "UserDoesNotExist";
}
else {
_response.Objects.Add(user);
}
return _response;
}
ObjectId 是使用 MongoDB.Bson 定义的数据类型。
对于 Json 序列化和反序列化,我们已经有了在两边自动转换的代码。但这是否可以在 Url 本身中进行类似的操作。
我们现在正在使用这个 Mvc 版本:
"Microsoft.AspNet.Mvc": "6.0.0-beta8"
所以 URL 看起来像这样:
GET Users/55b795827572761a08d735ac
将其从“string”解析为“ObjectId”的代码是:
ObjectId.TryParse(idString, out idObject);
问题是把 TryParse 代码放在哪里。因为我需要告诉 ASP.NET 它应该如何将 idObject 从 String 解析为 ObjectId。由于 URL 基本上是一个字符串。
对于 Post 或 Put JSON Payload,我已经找到了解决方案。我知道这是不同的东西。但可能有助于理解该场景,或找到该场景的解决方案:
public class EntityBaseDocument
{
[JsonConverter(typeof(ObjectIdConverter))]
public ObjectId Id { get; set; }
}
// Since we have this value converter. We can use ObjectId everywhere
public class ObjectIdConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value.ToString());
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
return new ObjectId(token.ToObject<string>());
}
public override bool CanConvert(Type objectType)
{
return typeof(ObjectId).IsAssignableFrom(objectType);
}
}
【问题讨论】:
标签: c# asp.net asp.net-web-api