aspnetcore/src/Microsoft.AspNetCore.Mvc.Core/ObjectResult.cs

62 lines
2.0 KiB
C#

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Mvc
{
public class ObjectResult : ActionResult, IStatusCodeActionResult
{
public ObjectResult(object value)
{
Value = value;
Formatters = new FormatterCollection<IOutputFormatter>();
ContentTypes = new MediaTypeCollection();
}
[ActionResultObjectValue]
public object Value { get; set; }
public FormatterCollection<IOutputFormatter> Formatters { get; set; }
public MediaTypeCollection ContentTypes { get; set; }
public Type DeclaredType { get; set; }
/// <summary>
/// Gets or sets the HTTP status code.
/// </summary>
public int? StatusCode { get; set; }
public override Task ExecuteResultAsync(ActionContext context)
{
var executor = context.HttpContext.RequestServices.GetRequiredService<IActionResultExecutor<ObjectResult>>();
return executor.ExecuteAsync(context, this);
}
/// <summary>
/// This method is called before the formatter writes to the output stream.
/// </summary>
public virtual void OnFormatting(ActionContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (StatusCode.HasValue)
{
context.HttpContext.Response.StatusCode = StatusCode.Value;
if (Value is ProblemDetails details && !details.Status.HasValue)
{
details.Status = StatusCode.Value;
}
}
}
}
}