2

我有一个 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":[...]
    }
}

现在调试器抛出一个空引用异常并说请求为空(断点在我的记录定义上)。

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

4

1 回答 1

4

我将这个问题转发给了希望使用 F# 和 Web API 的Ryan Riley,他说如下:

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

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

于 2012-08-04T19:12:03.930 回答