返回带有值的新操作结果,而不使用控制器库



我需要返回一个包含对象的ActionResult,但是,我不继承ControllerBase,所以我无法使用OkBadRequest等方法。我该怎么做?


更多信息:

我不从ControllerBase继承的原因是我持有一个通用的 Response 对象,其中包含一个返回 ActionResult 的方法。用于确定应返回哪个操作结果的逻辑将位于此方法中。


我试过:

  • ContentResult
    这使我可以选择提供值,但只接受字符串Content值。

  • StatusCodeResult
    这不会让我选择提供用作值的对象。

  • OkResultBadRequest
    这不会给我指定值的选项。


我的代码:

public enum ResponseStatus 
{
    Ok, 
    BadRequest,
    // ...
}
public class ResponseObject<T>
{
    public ResponseStatus Status { get; set; }
    public T Value { get; set; }
    public ActionResult ToActionResult()
    {
        switch (Status)
        {
            case ResponseStatus.Ok:
               return new SomethingThatIsOk(this); // this doesnt exist, I dont know to return, hence the question
            case ResponseStatus.BadRequest:
               return new SomethingThatIsBadRequest(this); // this doesnt exist, I dont know to return, hence the question
            // ...
        }
    }
}

有多个派生结果可用于获得所需的行为。

public class ResponseObject<T> {
    public ResponseStatus Status { get; set; }
    public T Value { get; set; }
    public ActionResult ToActionResult() {
        switch (Status) {
            case ResponseStatus.Ok:
               return new OkObjectResult(this);
            case ResponseStatus.BadRequest:
               return new BadRequestObjectResult(this);
            // ...
        }
    }
}

使用适合您所需状态的那个。

ObjectResult 类有几个派生类适用于此方案,

Microsoft.AspNetCore.Mvc.AcceptedAtActionResult
Microsoft.AspNetCore.Mvc.AcceptedAtRouteResult
Microsoft.AspNetCore.Mvc.AcceptedResult
Microsoft.AspNetCore.Mvc.BadRequestObjectResult
Microsoft.AspNetCore.Mvc.ConflictObjectResult
Microsoft.AspNetCore.Mvc.CreatedAtActionResult
Microsoft.AspNetCore.Mvc.CreatedAtRouteResult
Microsoft.AspNetCore.Mvc.CreatedResult
Microsoft.AspNetCore.Mvc.NotFoundObjectResult
Microsoft.AspNetCore.Mvc.OkObjectResult
Microsoft.AspNetCore.Mvc.UnauthorizedObjectResult
Microsoft.AspNetCore.Mvc.UnprocessableEntityObjectResult
System.Web.Http.BadRequestErrorMessageResult
System.Web.Http.ExceptionResult
System.Web.Http.InvalidModelStateResult
System.Web.Http.NegotiatedContentResult<T>
System.Web.Http.ResponseMessageResult

但我建议您查看 API 文档以获取可能适合您需求的任何其他类。

ControllerBase所做的只是将结果的创建包装在方法中

/// <summary>
/// Creates an <see cref="OkObjectResult"/> object that produces an <see cref="StatusCodes.Status200OK"/> response.
/// </summary>
/// <param name="value">The content value to format in the entity body.</param>
/// <returns>The created <see cref="OkObjectResult"/> for the response.</returns>
[NonAction]
public virtual OkObjectResult Ok([ActionResultObjectValue] object value)
    => new OkObjectResult(value);

/// <summary>
/// Creates an <see cref="BadRequestObjectResult"/> that produces a <see cref="StatusCodes.Status400BadRequest"/> response.
/// </summary>
/// <param name="error">An error object to be returned to the client.</param>
/// <returns>The created <see cref="BadRequestObjectResult"/> for the response.</returns>
[NonAction]
public virtual BadRequestObjectResult BadRequest([ActionResultObjectValue] object error)
    => new BadRequestObjectResult(error);

最新更新