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

问题描述 投票:1回答:3

我喜欢用一个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);
    }
}
c# asp.net asp.net-mvc
3个回答
4
投票

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

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);
    }
}

现在你可以在非错误条件下像普通的Jsonresult一样使用它,在错误条件下,它可以是:

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

1
投票

如果你真的只想要一次回归,那么这样做的简单方法是这样的:

public ActionResult SomeMethod()
{
    ActionResult result;
    try
    {
        result = TryGetTheCorrectResult();
    }
    catch
    {
        result = MakeSomeHttpStatusCodeResult();
    }
    return result;
}

你是否觉得“比”更好“,这真的是一个品味问题

public ActionResult SomeMethod()
{
    try
    {
        return TryGetTheCorrectResult();
    }
    catch
    {
        return MakeSomeHttpStatusCodeResult();
    }
}

具有较少局部变量的较短方法也可以提高代码质量,但这完全取决于我猜的味道。


1
投票

您只需发送响应代码以及您的回复:

Response.StatusCode = Convert.ToInt32(System.Net.HttpStatusCode.InternalServerError);

return Json(new { Data = carrots }, JsonRequestBehavior.AllowGet);
© www.soinside.com 2019 - 2024. All rights reserved.