2016-02-04 12 views
6

Dla części moment, chciałbym wykluczyć wartości puste z mojej odpowiedzi API, więc w moim pliku startup.cs, mam to.Ustaw NullValueHandling na poziomie kontrolera

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

Ale czy można stwierdzić, że na 1 lub więcej kontrolerów, faktycznie chcę uwzględnić wartości NULL?

Odpowiedz

0

Można uzyskać JsonOutputFormatter z BindingContext.OutputFormatters wewnątrz kodu kontrolera. To pozwala dynamicznie zmienić SerializerSettings.

Spróbuj zawierać using Newtonsoft.Json; w kodzie kontrolera i wykonać następujące czynności wewnątrz swojego działania kontrolera:

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; 
} 

włączyłem Formatting = Formatting.Indented tylko wyłącznie dla moich testów, ponieważ jeden natychmiast zobaczyć wyniki. Nie potrzebujesz jej przyczyny.

ZAKTUALIZOWANO: Utworzono projekt demonstracyjny przy użyciu aplikacji internetowej MVC bez uwierzytelniania. Potem dodaje się HomeController następujących Metodego

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

    return testResult; 
} 

i zmienił adres URL uruchomienia projektu do Home/TestMethod i rozpoczął prezentację. Widziałam

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

Nie trzeba dodać każdy dodatkowy użyciu instrukcji przy użyciu kodu, który napisałem na początku (jeden musi mieć tylko standardową using Microsoft.AspNet.Mvc; i using System.Linq;), ale kod może być bardziej czytelny jeśli ciebie miałby using Microsoft.AspNet.Mvc.Formatters; i using Newtonsoft.Json;. I dodał użyciu instrukcji dla Microsoft.AspNet.Mvc.Formatters i Newtonsoft.Json i zmodyfikowany kod do następujących

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; 
} 

Wyniki uzyskane wygląda teraz następująco

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

Standardowa użyć kodu "Newtonsoft.Json" w wersji 6.0.6. Możemy dodać "Newtonsoft.Json": "8.0.2" w zależnościach, aby użyć najnowszej wersji Newtonsoft.Json. Zobacz problem z rozwiązywaniem zależności pośrednich, które zgłosiłem w the issue i które wciąż są otwarte.

Możesz pobrać testowy projekt z here.

+1

Nie mogę zobaczyć BindingContext z mojej metody kontrolera? to dla ASPNET5? – Gillardo

+0

@ user2736022: Tak z przyczyny. Wewnątrz każdej akcji kontrolera masz 'this' z właściwościami' HttpContext', 'BindingContext' i tak dalej. Możesz po prostu wpisać 'this' wewnątrz swojej metody. Po wpisaniu '.' intellysense wyświetli wszystkie właściwości' this' zawierające 'BindingContext'. C# pozwala (poleca) napisanie 'BindingContext' zamiast' this.BindingContext'. – Oleg

+0

Czy możesz sprawdzić w przestrzeni nazw, w której się znajduje?Mówi, że mój kontroler nie zawiera definicji BindingContext – Gillardo