我有一个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。
答案 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