我正在向 JQGrid 返回 http 错误,但它看到 200 代码
I'm returning http error to JQGrid but it is seeing 200 code
有一个 web api 做 crud,还有一个 mvc 前端。在前端控制器中,这是 jqgrid 的编辑代码:
[HttpPost]
public JsonResult EditRecipientActivity(RecipientActivity model)
{
var result = HttpStatusCode.BadRequest;
if (ModelState.IsValid)
{
if (model.ActCount > 0)
{
var response = repo.SaveUpdatedRecipientActivity(model);
if (!response.IsSuccessStatusCode)
{
result = HttpStatusCode.BadRequest;
}
else
{
result = HttpStatusCode.OK;
}
return Json(result, JsonRequestBehavior.AllowGet);
}
else
{
var response = repo.AddRecipientActivity(model);
return Json(response.IsSuccessStatusCode, JsonRequestBehavior.AllowGet);
}
}
return Json(false, JsonRequestBehavior.AllowGet);
}
我正在尝试将服务器错误从 Web api 传递到 jqgrid,因此该消息出现在编辑表单上。
有了这个代码,我可以只向表单发送一个状态代码,但是 header 中的实际状态是 200,即使控制器返回 400。我如何传递实际状态表单代码?
编辑:更改了控制器方法。我不能使用 Request.CreateResponse,我猜是因为这不是 API 控制器:
[HttpPost]
public HttpResponseMessage EditRecipientActivity(RecipientActivity model)
{
var response = repo.SaveUpdatedRecipientActivity(model);
return response;
}
这是发送到网页的结果:
StatusCode:500,ReasonPhrase:'Internal Server Error',版本:1.1,内容:System.Net.Http.StreamContent,Headers:
{
编译指示:no-cache
X-SourceFiles: =?UTF-8?B?QzpcX1ZTX1Byb2plY3RzXHRlc3RcU0ZBQVJfU1ZDXFNGQUFSX1NWQ1xyZWNpcGllbnRcdXBkYXRlYWN0aXZpdHlcMTIzMTIzMTIz?=
Persistent-Auth:真
Cache-Control: no-cache
日期:2015 年 9 月 2 日,星期三 16:44:13 GMT
服务器:Microsoft-IIS/8.0
X-AspNet-Version:4.0.30319
X-Powered-By: ASP.NET
Content-Length: 2378
Content-Type: application/json;字符集=utf-8
过期:-1
}
这是我所希望的,但它没有触发 jqGrid 错误消息。知道为什么吗?
编辑 2:这是 navGrid 代码:
$("#activity-grid").jqGrid('navGrid', '#grid-pager',
{ edit: true, add: true, del: false, search: true, refresh: true },
{ //edit parameters
editData: { FV: fv, RecipKey: recipientId },
beforeShowForm: function (form) { $("#tr_ActCount", form).hide(); }, // Hides the ActCount field from the modal form
closeAfterEdit: true
},
{ //add parameters
editData: { FV: fv, ActCount: 0 },
beforeShowForm: function (form) { $("#tr_ActCount", form).hide(); }, // Hides the ActCount field from the modal form
closeAfterEdit: true
}
一种可能的方法是使用 HttpResponseMessage
作为 EditRecipientActivity
方法的 return 类型,并使用 Request.CreateResponse
和 HttpStatusCode.BadRequest
或任何其他值作为Request.CreateResponse
的第一个参数。它将允许在服务器响应中设置 HTTP 错误代码。您使用的当前代码只是在服务响应中设置数字或布尔值。
或者您可以使用 throw new HttpResponseException(HttpStatusCode.BadRequest);
(或其他一些 HTTP 错误)。
jqGrid 为您提供了另一种可能性,但只有当您使用的框架不提供在服务器响应中设置错误 HTTP 代码的可能性时才应使用它。在这种情况下,可以使用 afterSubmit 表单编辑回调。回调得到 jqXHR
作为第一个参数,可以使用 responseText
属性 来获取服务器响应的主体(你 return 目前是关于错误的信息服务器响应的主体)。如果服务器的响应应该被解释为成功,回调 afterSubmit
应该 return [true]
并且在错误的情况下 return [false, "error message"]
。
有一个 web api 做 crud,还有一个 mvc 前端。在前端控制器中,这是 jqgrid 的编辑代码:
[HttpPost]
public JsonResult EditRecipientActivity(RecipientActivity model)
{
var result = HttpStatusCode.BadRequest;
if (ModelState.IsValid)
{
if (model.ActCount > 0)
{
var response = repo.SaveUpdatedRecipientActivity(model);
if (!response.IsSuccessStatusCode)
{
result = HttpStatusCode.BadRequest;
}
else
{
result = HttpStatusCode.OK;
}
return Json(result, JsonRequestBehavior.AllowGet);
}
else
{
var response = repo.AddRecipientActivity(model);
return Json(response.IsSuccessStatusCode, JsonRequestBehavior.AllowGet);
}
}
return Json(false, JsonRequestBehavior.AllowGet);
}
我正在尝试将服务器错误从 Web api 传递到 jqgrid,因此该消息出现在编辑表单上。
有了这个代码,我可以只向表单发送一个状态代码,但是 header 中的实际状态是 200,即使控制器返回 400。我如何传递实际状态表单代码?
编辑:更改了控制器方法。我不能使用 Request.CreateResponse,我猜是因为这不是 API 控制器:
[HttpPost]
public HttpResponseMessage EditRecipientActivity(RecipientActivity model)
{
var response = repo.SaveUpdatedRecipientActivity(model);
return response;
}
这是发送到网页的结果:
StatusCode:500,ReasonPhrase:'Internal Server Error',版本:1.1,内容:System.Net.Http.StreamContent,Headers: { 编译指示:no-cache X-SourceFiles: =?UTF-8?B?QzpcX1ZTX1Byb2plY3RzXHRlc3RcU0ZBQVJfU1ZDXFNGQUFSX1NWQ1xyZWNpcGllbnRcdXBkYXRlYWN0aXZpdHlcMTIzMTIzMTIz?= Persistent-Auth:真 Cache-Control: no-cache 日期:2015 年 9 月 2 日,星期三 16:44:13 GMT 服务器:Microsoft-IIS/8.0 X-AspNet-Version:4.0.30319 X-Powered-By: ASP.NET Content-Length: 2378 Content-Type: application/json;字符集=utf-8 过期:-1 }
这是我所希望的,但它没有触发 jqGrid 错误消息。知道为什么吗?
编辑 2:这是 navGrid 代码:
$("#activity-grid").jqGrid('navGrid', '#grid-pager',
{ edit: true, add: true, del: false, search: true, refresh: true },
{ //edit parameters
editData: { FV: fv, RecipKey: recipientId },
beforeShowForm: function (form) { $("#tr_ActCount", form).hide(); }, // Hides the ActCount field from the modal form
closeAfterEdit: true
},
{ //add parameters
editData: { FV: fv, ActCount: 0 },
beforeShowForm: function (form) { $("#tr_ActCount", form).hide(); }, // Hides the ActCount field from the modal form
closeAfterEdit: true
}
一种可能的方法是使用 HttpResponseMessage
作为 EditRecipientActivity
方法的 return 类型,并使用 Request.CreateResponse
和 HttpStatusCode.BadRequest
或任何其他值作为Request.CreateResponse
的第一个参数。它将允许在服务器响应中设置 HTTP 错误代码。您使用的当前代码只是在服务响应中设置数字或布尔值。
或者您可以使用 throw new HttpResponseException(HttpStatusCode.BadRequest);
(或其他一些 HTTP 错误)。
jqGrid 为您提供了另一种可能性,但只有当您使用的框架不提供在服务器响应中设置错误 HTTP 代码的可能性时才应使用它。在这种情况下,可以使用 afterSubmit 表单编辑回调。回调得到 jqXHR
作为第一个参数,可以使用 responseText
属性 来获取服务器响应的主体(你 return 目前是关于错误的信息服务器响应的主体)。如果服务器的响应应该被解释为成功,回调 afterSubmit
应该 return [true]
并且在错误的情况下 return [false, "error message"]
。