Если вы собираетесь часто использовать этот шаблон, чтобы сохранить ваши контроллеры как можно более чистыми, вы можете создать базовый класс, который предоставляет метод «FormatOrView»:
[FormatFilter]
public abstract class FormatController : Controller
{
protected ActionResult FormatOrView(object model)
{
var filter = HttpContext.RequestServices.GetRequiredService<FormatFilter>();
if (filter.GetFormat(ControllerContext) == null)
{
return View(model);
}
else
{
return new ObjectResult(model);
}
}
}
И затемваш контроллер может унаследовать это и использовать метод FormatOrView
public class ProductsController : FormatController
{
[Route("[controller]/[action]/{id}.{format?}")]
public ActionResult GetById(int id)
{
var product = new { Id = id };
return FormatOrView(product);
}
}
Изменить, чтобы отобразить окончательно принятый ответ GreyCloud: Вот общий слегка упрощенный метод, который вы можете поместить в контроллер (или создать метод расширения или поместитьв абстрактный базовый класс, как указано выше).Обратите внимание ?.в случае, если услуга не определена по какой-либо причине.
private ActionResult<T> FormatOrView<T>(T model) {
return HttpContext.RequestServices.GetRequiredService<FormatFilter>()?.GetFormat(ControllerContext) == null
? View(model)
: new ActionResult<T>(model);
}