public class MvcApiJsonRequest : JsonResult {
    private readonly int _httpStatusCode;
    private readonly string _invalidHttpStatusCodeMessage = "set httpStatusCode to an allowed http status code";

    public MvcApiJsonRequest() {
        _httpStatusCode = 200;
    }

    public MvcApiJsonRequest(object content) : this(200, content) {}
    public MvcApiJsonRequest(int httpStatusCode) : this(httpStatusCode, null) {}

    public MvcApiJsonRequest(int httpStatusCode, object content) {
        // TODO: better method name
        IsStatusCodeAllowed(httpStatusCode);

        _httpStatusCode = httpStatusCode;
        Data = content;
    }

    public int HttpStatusCode => _httpStatusCode;

    public override void ExecuteResult(ControllerContext context) {
        context.HttpContext.Response.StatusCode = HttpStatusCode;
        base.ExecuteResult(context);
    }

    private void IsStatusCodeAllowed(int httpStatusCode) {
        switch (httpStatusCode) {
            case 0:
                throw new ArgumentOutOfRangeException(nameof(httpStatusCode), _invalidHttpStatusCodeMessage);
            case 200:
                break;
            case 201:
                break;
            case 400:
                break;
            default:
                throw new ArgumentOutOfRangeException(nameof(httpStatusCode), _invalidHttpStatusCodeMessage);
        }
    }
}