【发布时间】:2017-12-09 16:44:45
【问题描述】:
如何使用 MongoDB 将动态 JSON 属性发布到 C# ASP.Net Core Web API?
似乎 MongoDB 的优势之一是能够将您需要的任何内容存储在 Object 类型属性中,但似乎不清楚如何通过 C# Web 从客户端 ajax 帖子获取动态属性信息MongoDB 的 API。
我们希望允许管理员创建一个带有标题和开始日期/时间的事件,但我们也希望允许用户使用响应式表单添加自定义表单字段,以满足他们想要的任何内容,例如 T 恤尺寸或膳食偏好。 .. 无论用户将来想出什么。然后,当有人注册该事件时,他们会将 EventID 和自定义字段发布到 Web API。
我们可以拥有一个包含 _id、event_id、reg_time 和 form_fields 的 Event MongoDB 集合,其中 form_fields 是存储动态数据的对象类型。
所以我们想用自定义的 FormsFields 发布这个 JSON 的变体:
变体 1:
{
"EventId": "595106234fccfc5fc88c40c2",
"RegTime":"2017-07-21T22:00:00Z",
"FormFields": {
"FirstName": "John",
"LastName": "Public",
"TShirtSize": "XL"
}
}
变体 2:
{
"EventId": "d34f46234fccfc5fc88c40c2",
"RegTime":"2017-07-21T22:00:00Z",
"FormFields": {
"Email": "John.Public@email.com",
"MealPref": "Vegan"
}
}
我想要一个带有 Post 操作的 EventController,它采用映射到上述 JSON 的自定义 C# EventReg 对象。
事件控制器:
[HttpPost]
public void Post([FromBody]EventReg value)
{
eventService.AddEventRegistration(value);
}
EventReg 类:
public class EventReg
{
public EventReg()
{
FormFields = new BsonDocument();
}
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string EventRegId { get; set; }
[BsonElement("EventId")]
[BsonRepresentation(BsonType.ObjectId)]
public string EventId { get; set; }
[BsonElement("reg_time")]
public DateTime RegTime
{
set; get;
}
[BsonElement("form_fields")]
public MongoDB.Bson.BsonDocument FormFields { get; set; }
}
事件服务
public string AddEventRegistration(EventReg eventReg)
{
this.database.GetCollection<EventReg>("event_regs").InsertOne(eventReg);
return eventReg.EventRegId;
}
现在,如果我发布到控制器,我的 EventReg 为 null,因为它一定不知道如何将我的 JSON FormFields 属性映射到 BsonDocument。
- FormFields 可以使用什么类型?
- 我可以将 FormFields 属性设置为 BsonDocument,是否有一种简单的方法可以将 Web API 参数映射到该属性?
- 是否有示例说明某些自定义序列化程序在这种情况下如何工作?
我们也许可以使用动态类型并循环通过发布的属性,但这看起来很难看。我还从这里的帖子中看到了 JToken 解决方案,但这看起来也很丑陋。
如果 MongoDB 打算像这样动态使用,难道不应该有一个干净的解决方案将动态数据传递给 MongoDB 吗?有什么想法吗?
【问题讨论】:
标签: c# asp.net json mongodb asp.net-core-webapi