我在Web API上发布操作的参数始终为null

时间:2012-08-02 20:39:34

标签: .net json f# asp.net-web-api

我有一个F#WebAPI项目,由于某种原因,Post方法的参数总是设置为null。

(这些名字都是匿名的)

这是控制器:

type TestController() =
    inherit ApiController()
    member x.Get () =
        getValues ()

    member x.Post ([<FromBody>] values: Values) =
        storeValues values

记录Values的定义方式如下:

type TypeA = {
    Id: string
    ....
    }

....

type Values = {
    AValues: list<TypeA>
    BValues: list<TypeB>
    CValues: list<TypeC>
    }

在我看来,我像这样对API进行POST调用:

        return $.ajax({
            type: "POST",
            url: url,
            data: JSON.stringify(params),
            contentType: "application/json",
            beforeSend: function (jqXHR) { jqXHR.setRequestHeader("X-HTTP-Method", type); }
        });

其中data出现在:

{
    "AValues":[{"Id":"blahblah", ....}],
    "BValues":[...],
    "CValues":[...]
}

我更新了JS以使data评估为:

{
    "Values":
    {
        "AValues":[{"Id":"blahblah", ....}],
        "BValues":[...],
        "CValues":[...]
    }
}

现在调试器抛出一个null引用异常,并说Requests为null(断点在我的记录定义中)。

问题是它确实击中了控制器中的Post方法,但values始终设置为null。

1 个答案:

答案 0 :(得分:4)

我将问题转发给Ryan Riley,他对F#和Web API都抱有期待,他说了以下内容:

  

即使你做了,你也不能使用默认模型绑定器的记录   成员可变,因为记录没有默认构造函数。   F#3.0引入了一个允许记录的CLIMutableAttribute [1]   用这种方式。

     

[1] http://blogs.msdn.com/b/fsharpteam/archive/2012/07/19/more-about-fsharp-3.0-language-features.aspx