将Json actionresult和HttpStatusCodeResult都作为可能的结果,但只有一个返回

Dje*_*sen 1 c# asp.net asp.net-mvc

由于多种原因,我喜欢仅使用一个return语句来设计我的方法(我认为这是最佳实践)。

但是,如何让MVC控制器actionresult创建结果对象,在其中我既可以将HttpStatusCodeResult放入其中,也可以将普通的Json结果放入其中?

它们都继承自ActionResult。

编辑: 我现在拥有的示例,但是想更改为仅1个return语句,就像这样:

public ActionResult Test(string inputString = "stack")
{
    try
    {
        int carrots = int.Parse(inputString);
        return Json(new { Data = carrots }, JsonRequestBehavior.AllowGet);
    }
    catch (Exception)
    {
        return new HttpStatusCodeResult(400);
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 5

您可以继承并扩展JsonResult类,该类添加了Http状态代码。

public class JsonHttpStatusResult : JsonResult
{
    private readonly HttpStatusCode _httpStatus;

    public JsonHttpStatusResult(object data, HttpStatusCode httpStatus)
    {
        Data = data;
        _httpStatus = httpStatus;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        context.RequestContext.HttpContext.Response.StatusCode = (int)_httpStatus;
        base.ExecuteResult(context);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以在非错误情况下像正常的Jsonresult一样使用它,在错误情况下,它可以是:

var errorModel = new { error = "There was an error" };
    return new JsonHttpStatusResult(errorModel, HttpStatusCode.InternalServerError);
Run Code Online (Sandbox Code Playgroud)