3

null許容型を含み、null値を持つオブジェクトのWebApiアプリケーションでModelState検証に合格できません。エラーメッセージは、「値'null'はDatePropertyに対して無効です。」です。

オブジェクトのコード:

public class TestNull
{
    public int IntProperty { get; set; }
    public DateTime? DateProperty { get; set; }
}

コントローラ:

public class TestNullController : ApiController
{
    public TestNull Get(int id)
    {
        return new TestNull() { IntProperty = 1, DateProperty = null };
    }

    public HttpResponseMessage Put(int id, TestNull value)
    {
        if(ModelState.IsValid)
            return Request.CreateResponse(HttpStatusCode.OK, value);
        else
        {
            var errors = new Dictionary<string, IEnumerable<string>>();
            foreach (var keyValue in ModelState)
            {
                errors[keyValue.Key] = keyValue.Value.Errors.Select(e => e.ErrorMessage);
            }

            return Request.CreateResponse(HttpStatusCode.BadRequest, errors);
        }
    }
}

リクエスト:

$.getJSON("api/TestNull/1",
function (data) {
    console.log(data);
    $.ajax({
        url: "api/TestNull/" + data.IntProperty,
        type: 'PUT',
        datatype: 'json',
        data: data
    });
});
4

2 に答える 2

4

自分のWebAPIプロジェクトで簡単なテストを行ったところ、null許容値型の値としてnullを渡すと正常に機能します。Fiddlerなどのツールを使用して、サーバーに送信されている実際のデータを調べることをお勧めします

動作する2つの有効なシナリオは次のとおりです。

{ IntProperty: 1, DateProperty: null } 
{ IntProperty: 1 } // Yes, you can simply leave the property out

動作しないシナリオは次のとおりです。

{ IntProperty: 1, DateProperty: "null" } // Notice the quotes
{ IntProperty: 1, DateProperty: undefined } // invalid JSON
{ IntProperty: 1, DateProperty: 0 } // Will not be properly interpreted by the .NET JSON Deserializer 

2つのデフォルトのシナリオが機能しない場合は、問題が他の場所にあると思われます。つまり、global.asaxのJSONシリアライザーのデフォルト設定のいずれかを変更しましたか?

于 2012-08-12T14:34:23.840 に答える
0

ほぼ9年後、ASP.NETCore3.1でも同様の問題が発生しています。

しかし、私は回避策を見つけました(nullとして値を送信するのではなく、送信されるデータからnull値を除外するだけです)。

https://stackoverflow.com/a/66712465/908608を参照してください

バックエンドはまだnull値を適切に処理しないため、これは実際の解決策ではありませんが、少なくともModelState検証はnull許容プロパティに対して失敗しません。

于 2021-03-19T17:03:34.840 に答える