簡體   English   中英

如何使用模型屬性作為接口在ASP.NET Web API中進行POST

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM