【问题标题】:Using dynamic parameters in Web API methods在 Web API 方法中使用动态参数
【发布时间】:2017-07-25 06:10:05
【问题描述】:

我正在开发一个 Web API 项目并使用 Massive 来执行数据库任务。 在我的控制器中,我希望 Post 方法接受一个动态对象,以便 Massive Insert 方法可以直接使用它。

public class LinkController : ApiController
{
    public IHttpActionResult Post(dynamic link)
    {
        dynamic model = new Massive.DynamicModel("main", tableName: "Links", primaryKeyField: "Id");
        return Ok(model.Insert(link));
    }
}

在 POST 请求中发送以下 JSON:

{
    "Name":"StackOverflow",
    "Url":"http://www.stackoverflow.com",
    "Description":"My most visited web site!",
    "FolderId":2
}

我的问题是 JSON.Net 反序列化 JSON 的方式。调用Post方法时,链接参数如预期有4个属性 但它们的类型是 Newtonsoft.Json.Linq.JValue 而不是一些原始类型(例如 Name 的字符串),Massive 不能 处理 JValue 对象。

我需要强制参数具有其属性的原始类型(通过创建自定义 JsonConverter、调整 Web API 模型绑定......)。

【问题讨论】:

    标签: c# json asp.net-web-api dynamic json.net


    【解决方案1】:

    您能做的最好的事情就是将您的 DTO 反序列化为 ExpandoObject

    // config.GetType() == typeof(HttpConfiguration)
    config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new ExpandoObjectConverter());
    

    当您访问它的属性时,它仍然是一个动态对象,因为它们是在具有 .NET CLR 类型的常规类中设计的。

    【讨论】:

    • 感谢您的回答。我试过了,但不幸的是没有任何改变
    • @FarzanHajian 这是不可能的,因为这是我配置自己的一些 WebAPI 以使其正常工作的方式......
    猜你喜欢
    • 1970-01-01
    • 2014-03-01
    • 2016-04-02
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 2016-01-20
    相关资源
    最近更新 更多