WebAPI媒体类型格式化程序不绑定JSON?

时间:2013-05-24 19:07:52

标签: c# asp.net-mvc-4 model-binding

我很沮丧,因为我在过去使用MVC2 + 3做了一些绑定,所以我无法弄明白这一点我有一个方法:

[System.Web.Http.HttpPost]
public ResponseModel Handler([FromBody]RequestModel tableRequest)
{
    return CreateTableResponse(tableRequest);
}

除了我不知道它是如何绑定到这个模型之外,哪个很好 - 因为我不确定它的绑定方式我不知道如何通过为发送的值指定不同的名称来应用自定义绑定(使用JSON发送'应用程序/ JSON'):

public class RequestModel
{
    [JsonProperty(PropertyName = "sName")]
    public String Name {get;set;}

    public List<AEntity> RequestEntities {get;set;}
}

我知道RequestEntities需要一些绑定工作,但为什么RequestModel.Name不能绑定到JSON中的sNameRequestModel.RequestEntities真的很尴尬,因为发送的JSON格式为:RequestModel.RequestEntities[0].ID对应iID_0好吧?我无法更改JSON的发送方式。

{
    "RequestModel" : 
    {
        "sName" : "john",
        "iID_0" : 1,
        "iID_1" : 2,
        "iID_2" : 3
    }
}

是否可以指定MediaTypeFormatter或获取JSON作为参数?我如何绑定到该模型?

幕后所有这些魔力都无济于事。

1 个答案:

答案 0 :(得分:0)

默认的ASP.NET ModelBinder无法处理这种复杂对象。所以,有两种方法可以使这项工作。

1)实现一个自己的ModelBinder,你可以看看这里:ASP.NET MVC Model Binding,这将需要一些工作来实现。

2)对行动进行一些改动(我认为你应该这样做!):

使用这样的ajax发布我们的数据:

data: JSON.stringify({ name: 'name here', requestEntities: [...content as an array] }),

Obs:确保JSON中的每个名称都与Model中的属性名称匹配,否则默认的modelbinder将失败。

单独发送姓名和申请:

[HttpPost]
public ResponseModel Handler(string name, List<AEntity> requestEntities)
{
    //Populate RequestModel here..
    return CreateTableResponse(name, tableRequest);
}

希望这能帮到你!