Этого можно добиться с помощью комбинации Фильтр действий и Форматировщик вывода .Вот пример того, как может выглядеть фильтр действий:
public class SnakeCaseAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext ctx)
{
if (ctx.Result is ObjectResult objectResult)
{
objectResult.Formatters.Add(new JsonOutputFormatter(
new JsonSerializerSettings
{
ContractResolver = new DefaultContractResolver
{
NamingStrategy = new SnakeCaseNamingStrategy()
}
},
ctx.HttpContext.RequestServices.GetRequiredService<ArrayPool<char>>()));
}
}
}
Используя OnActionExecuted
, код запускается после соответствующего действия и сначала проверяет, является ли результат ObjectResult
(который также применяетсядо OkObjectResult
благодаря наследованию).Если это ObjectResult
, фильтр просто добавляет настроенную версию JsonOutputFormatter
, которая будет сериализовать свойства, используя SnakeCaseNamingStrategy
.Второй параметр в конструкторе JsonOutputFormatter
извлекается из контейнера DI.
Чтобы использовать этот фильтр, просто примените его к соответствующему контроллеру:
[SnakeCase]
public class ControllerB : Controller { }
Примечание: Возможно, вы захотите создать JsonOutputFormatter
где-нибудь раньше, например - я не зашел так далеко в этом примере, поскольку это вторично по отношению к рассматриваемому вопросу.