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":[...]
    }
}

そして今、デバッガーは nullreference 例外をスローし、Requests が null であると言います (ブレークポイントは私のレコード定義にあります)。

問題は、コントローラーの 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 に答える