[英]How to POST in ASP.NET Web API with model property as interface
假設我有一個模型:
public class Menu
{
public string Name { get; set; }
public IMenuCommand Next { get; set; }
}
IMenuCommand
可以具有不同的實現,例如:
public class NextStepCommand : IMenuCommand
{
public int Step { get; set; }
}
public class VoiceCommand : IMenuCommand
{
public string Message { get; set; }
}
我想用不同的命令POST菜單到ASP.NET Web API服務。 我怎樣才能做到這一點?
以下請求將創建一個具有指定Name
的對象,但Next
命令將為null:
POST http://localhost/api/menus: {"name":"bob","next":{"step":1}}
Returns 201: {"Name":"bob","Next":null}
默認的Web API綁定器無法將我的請求參數映射到所需的C#類型-當然,這是一個棘手的部分。 是否可以對基於接口的屬性使用某些“已知類型”屬性,或者是否有其他方法可以處理這種情況(可能是自定義模型綁定程序)?
我認為您正在尋找的是Json.NET對類型名稱處理的支持。 它允許您通過添加“ $ type” json標簽來指定要反序列化的類型。 您可以嘗試以下代碼以查看其工作方式:
Console.WriteLine(JsonConvert.DeserializeObject<Menu>(
@"{
""name"":""bob"",
""next"":
{
""$type"" : ""ConsoleApplication.NextStepCommand,ConsoleApplication"",
""step"" : 1
}
}",
new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.Auto }).Next);
您必須用自己的名稱空間和程序集名稱替換,但是您應該看到正確地反序列化了NextStepCommand。
在WebAPI中,您需要調整請求以添加“ $ type”類型信息,並且需要啟用TypeNameHandling,如下所示:
config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.