我喜欢用一个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);
}
}
您可以继承并扩展添加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);
如果你真的只想要一次回归,那么这样做的简单方法是这样的:
public ActionResult SomeMethod()
{
ActionResult result;
try
{
result = TryGetTheCorrectResult();
}
catch
{
result = MakeSomeHttpStatusCodeResult();
}
return result;
}
你是否觉得“比”更好“,这真的是一个品味问题
public ActionResult SomeMethod()
{
try
{
return TryGetTheCorrectResult();
}
catch
{
return MakeSomeHttpStatusCodeResult();
}
}
具有较少局部变量的较短方法也可以提高代码质量,但这完全取决于我猜的味道。
您只需发送响应代码以及您的回复:
Response.StatusCode = Convert.ToInt32(System.Net.HttpStatusCode.InternalServerError);
return Json(new { Data = carrots }, JsonRequestBehavior.AllowGet);