无法正确绑定视图模型

时间:2013-08-05 12:30:49

标签: asp.net asp.net-mvc asp.net-web-api model-binding

我想使用log4javascript创建客户端日志记录基础结构。所有日志都发送到服务器。那部分效果很好。我创建了WebApi控制器来在服务器上写入这些日志消息。请求如下:

Request Headers

我创建了以下视图模型:

 public class LogEntryViewModel
{
    public string logger { get; set; }
    public int timestamp { get; set; }
    public string level { get; set; }
    public string url { get; set; }
    public string[] message { get; set; }
}

public class LoggerViewModel
{
  public LogEntryViewModel data { get; set; }
  public string layout { get; set; }
}

但问题是LogEntryViewModel中的所有数据都是默认的。即使我将public LogEntryViewModel data更改为public JObject data,也会导致空data个对象。我试图解析请求包含的Json,这是正确的。这可能是什么问题?

编辑:

当我将Content-Type更改为application/json;charset=UTF-8时,请求按以下方式查看:

Request #2

然后我在控制器上更改了Post方法:

// POST api/loggerservice
    public void Post([FromBody]LogEntryViewModel log)
    {
        //BL
    }

然而,效果仍然相同。

1 个答案:

答案 0 :(得分:3)

  

在Web API中,媒体类型确定Web API如何序列化和反序列化HTTP消息正文。内置对XML,JSON和表单 - urlencoded数据的支持,您可以通过编写媒体格式化程序来支持其他媒体类型。

我认为,根据您的内容类型(x-www-form-urlencoded),Web Api需要类似于logger=AjaxLogger&timestamp=1375705087456...的内容,因此它可以将序列化程序用于表单urlencoded数据。

由于您要将JSON发送到服务器,我建议将Content-Type设置为 application / json 并使用JSON.stringify,以便它可以将JSON序列化程序用于模型结合:

data: JSON.stringify({'logger':'AjaxLogger', 'timestamp': '1234568789'})

您可能现在也想删除布局属性。

您不需要[FromBody]。这个blogpost帮助我理解了[FromBody]属性