2016-02-04 1 views
6

今のところ、私は私のstartup.csファイルで、私のAPI応答からヌル値を除外したいと思います。コントローラレベルでNullValueHandlingを設定する

services.AddMvc() 
    .AddJsonOptions(options => 
    { 
     // Setup json serializer 
     options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
     options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore; 
    }); 

しかし、1つ以上のコントローラで、実際にはNULL値を含めることができますか?

答えて

0

この質問に記載されているように、カスタムJson結果タイプを作成することもできます。Using JSON.NET as the default JSON serializer in ASP.NET MVC 3 - is it possible?。その後、ベースコントローラ上のブールVARを持っており、それが無効にヌルの使用してカスタムJson結果を行う、あるいは直接オプションを渡す使用することができます:あなたは、あなたのコントローラのコードの内部でBindingContext.OutputFormattersからJsonOutputFormatterを得ることができます

return Json(data, ignoreNulls: true); 
0

。それはあなたがを動的にSerializerSettingsを変更することができます。

は、コントローラコードでusing Newtonsoft.Json;を含めるようにして、コントローラのアクションの中に次の操作を実行してください:

var f = BindingContext.OutputFormatters.FirstOrDefault(
      formatter => formatter.GetType() == 
         typeof (Microsoft.AspNet.Mvc.Formatters.JsonOutputFormatter)) 
     as Microsoft.AspNet.Mvc.Formatters.JsonOutputFormatter; 
if (f != null) { 
    //f.SerializerSettings.Formatting = Formatting.Indented; 
    f.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore; 
} 

1はすぐに結果を参照してくださいので、私は、ただ唯一の私のテストのためにFormatting = Formatting.Indentedが含まれています。あなたはそれを必要としません。

UPDATED: MVC Webアプリケーションを使用して認証なしでデモプロジェクトを作成しました。それから私はmetod

public object TestMethod() 
{ 
    var testResult = new { 
         name = "Test", 
         value = 123, 
         nullableProperty = (string) null 
        }; 

    return testResult; 
} 

HomeControllerに追加され、Home/TestMethodにプロジェクトの起動URLを変更して、デモを開始しました。あなた場合、私は(1がちょうど標準using Microsoft.AspNet.Mvc;を持っており、using System.Linq;必要が)あなたは私が最初に掲載コードを使用するステートメントを使用して、追加を追加する必要はありません

{"name":"Test","value":123,"nullableProperty":null} 

を見ることができますが、コードが読みやすくなる可能性using Microsoft.AspNet.Mvc.Formatters;using Newtonsoft.Json;があります。私はMicrosoft.AspNet.Mvc.FormattersNewtonsoft.Jsonのためのusingステートメントを追加し、出力結果が

{ 
    "name": "Test", 
    "value": 123 
} 

バージョン6.0.6での標準コード使用"Newtonsoft.Json"を以下のようになりまし見える次

public object TestMethod() 
{ 
    var testResult = new { 
         name = "Test", 
         value = 123, 
         nullableProperty = (string) null 
        }; 

    var f = BindingContext.OutputFormatters.FirstOrDefault(
       formatter => formatter.GetType() == typeof (JsonOutputFormatter)) as JsonOutputFormatter; 
    if (f != null) { 
     f.SerializerSettings.Formatting = Formatting.Indented; 
     f.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; 
    } 
    return testResult; 
} 

にコードを修正しました。我々はNewtonsoft.Jsonの最新バージョンを使用するために、依存関係に"Newtonsoft.Json": "8.0.2"を追加できます。 the issueで報告した、間接依存関係の解決に関する問題を参照してください。まだ開いています。

hereからテストプロジェクトをダウンロードできます。

+1

私のコントローラメソッド内からBindingContextが見えないようですか?これはASPNET5のためのものですか? – Gillardo

+0

@ user2736022:原因はあります。すべてのコントローラアクションの内部には、 'HttpContext'、' BindingContext'などのプロパティを持つ 'this'があります。メソッドの中に 'this.'と入力するだけです。 '.' intellysenseと入力すると' BindingContext'を含む 'this'のすべてのプロパティが表示されます。 C#では 'this.BindingContext'の代わりに' BindingContext'を書くことができます(推奨)。 – Oleg

+0

あなたはそれが内部にある名前空間で確認できますか?それは私のコントローラがBindingContextの定義を含んでいないと言います。 – Gillardo

関連する問題