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.
Nie mogę zobaczyć BindingContext z mojej metody kontrolera? to dla ASPNET5? – Gillardo
@ 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
Czy możesz sprawdzić w przestrzeni nazw, w której się znajduje?Mówi, że mój kontroler nie zawiera definicji BindingContext – Gillardo