我想知道API控制器中是否有办法将自定义对象作为响应体返回,例如:BadRequest()
或NotFound()
。
例如,对于 404 错误,我想返回类似的内容:
{
"StatusCode": 404,
"Error": "Not Found",
"Message": "Custom message..."
}
相反,我得到了这个:
{
"Message": "Custom message..."
}
目前要返回复杂的响应主体,我正在以这种方式使用Ok()
:
return Ok(new
{
Success = false,
Message = "Custom message...",
// other fields...
});
但显然我正在返回一个 200 状态并没有那么有意义。
有没有更好的方法来实现这一目标?
答案 0 :(得分:3)
如果您需要快速解决方案,只需跳转到 Short Way ,阅读本文只是为了了解它是如何工作的。派生自JsonErrorResult
派生的JsonResult
类:
public sealed JsonErrorResult : JsonResult
{
public JsonErrorResult(StatusCodes statusCode, object value)
: base(value)
{
_statusCode = statusCode;
}
private readonly JsonErrorResult StatusCodes _statusCode;
}
现在覆盖ExecuteResultAsync()
方法以更改默认JsonResult
实施的状态代码:
public override Task ExecuteResultAsync(ActionContext context)
{
context.HttpContext.Response.StatusCode = _statusCode;
return base.ExecuteResultAsync(context);
}
您只需返回致电BadRequest()
即可:
return new JsonErrorResult(StatusCodes.Status400BadRequest, new
{
StatusCode = "404",
Error = "bla bla bla",
Message = "bla bla bla"
});
当然,如果你经常使用它,你可能想要创建自己的帮助方法:
protected static JSonErrorResult JsonError(StatusCodes statusCode,
string error, string message)
{
return new JsonErrorResult(statusCode, new
{
StatusCode = Convert.ToString((int)statusCode),
Error = error,
Message = message
});
}
像这样使用:
return JsonError(StatusCodes.Status400BadRequest, "bla bla bla", "bla bla bla");
JsonResult
已经有StatusCode
属性,那么你的帮助方法可能会变成这样:
protected static JSonResult JsonError(StatusCodes statusCode,
string error, string message)
{
var result = new JsonResult(new
{
StatusCode = Convert.ToString((int)statusCode),
Error = error,
Message = message
});
result.StatusCode = (int)statusCode;
return result;
}
答案 1 :(得分:0)
我通常会返回这样的内容:
return Json(new { success = false, data = "" }, JsonRequestBehavior.AllowGet);
然后在我的AJAX成功中,我做到了:
if(result.success){
result.data...
}else{
//error...
}
如果您不想总是发送200个代码,那么您可以这样做吗?
//if success...
Response.StatusCode = 200;
return Json(new { responseCode = 200, data = "", message = "..." }, JsonRequestBehavior.AllowGet);
//if failure...
Response.StatusCode = 404;
return Json(new { responseCode = 404, data = "", message = "..." }, JsonRequestBehavior.AllowGet);
答案 2 :(得分:0)
创建处理错误的函数。
function AjaxCompletion(xhr) {
switch (xhr.status) {
case 200:
//Your Message
break;
case 401: //unauthorize
//Your desire message
break;
}
}
在AJAX complete
:
complete: function (xhr) {
AjaxCompletion(xhr);
}
答案 3 :(得分:0)
感谢你的代码,它工作了一段时间。 您似乎已经编写了伪代码而不是代码本身。 所以,为了让其他人的生活更轻松,这里的代码完全相同,但是有一个运行的类。
multiple
最后你这样称呼它:
public sealed class JsonErrorResult : JsonResult {
private readonly HttpStatusCode _statusCode;
public JsonErrorResult(HttpStatusCode sCode, object value) : base(value) {
_statusCode = sCode;
}
public override Task ExecuteResultAsync(ActionContext context) {
context.HttpContext.Response.StatusCode = (int)_statusCode;
return base.ExecuteResultAsync(context);
}
public static JsonResult JsonError(HttpStatusCode statusCode,
string message, string error = "") {
var result = new JsonResult(new {
StatusCode = Convert.ToString((int)statusCode),
Error = error,
Message = message
});
result.StatusCode = (int)statusCode;
return result;
}
}