我希望将ASP.NET MVC上任何AJAX调用的每个结果都包含到JSON对象中,该对象应该是: AjaxResult {status,data}
其中status将包含一个枚举值,用于描述调用是否成功,错误,身份验证是否已过期等。这将使客户端代码能够重定向到登录页面等。
我尝试通过覆盖OnActionExecuted来捕获Ajax请求,并尝试使用以下代码渲染相应的操作结果返回,但此解决方案似乎运行缓慢。你有更好的主意吗?
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.Exception == null)
{
if (filterContext.Result.GetType() == typeof(ViewResult))
{
ViewResult viewResultTemp = (ViewResult)filterContext.Result;
using (StringWriter sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewResultTemp.ViewName);
ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
var ajaxReply = new AjaxReply(AjaxReplyStatus.Success, string.Empty, sw.ToString());
filterContext.Result = new JsonResult {Data = ajaxReply};
}
}
else if (filterContext.Result.GetType() == typeof(PartialViewResult))
{
PartialViewResult partialViewResultTemp = (PartialViewResult)filterContext.Result;
using (StringWriter sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, partialViewResultTemp.ViewName);
ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
var ajaxReply = new AjaxReply(AjaxReplyStatus.Success, string.Empty, sw.ToString());
filterContext.Result = new JsonResult { Data = ajaxReply };
}
}
else if (filterContext.Result.GetType() == typeof(JsonResult))
{
JsonResult jsonResult = (JsonResult)filterContext.Result;
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
string jsonData = javaScriptSerializer.Serialize(jsonResult.Data);
var ajaxReply = new AjaxReply(AjaxReplyStatus.Success, string.Empty, jsonData);
filterContext.Result = new JsonResult { Data = ajaxReply };
}
}
}
答案 0 :(得分:0)
为什么你需要这个?
创建自定义ApplicationController并从中派生所有控制器。
在ApplicationController中实现方法Json<data>()
where data
public JsonResult Json<TData>(TData data, bool status) where TData : class
{
return Json(
new
{
data,
status
},
JsonRequestBehavior.AllowGet);
}
答案 1 :(得分:0)
你真的需要这样做吗?
如果您的ajax调用成功,则将返回HTTP 200,并且将调用您的成功jQuery回调。如果你的调用失败而不是抛出异常,让jQuery在从服务器收到HTTP 500后调用错误回调。
如果呼叫因某种原因成功或失败,HTTP状态代码是通知呼叫者的正确方法。