2

我希望将 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 };
        }
    }
}
4

2 回答 2

0

你真的需要这样做吗?

如果您的 ajax 调用成功,则将返回 HTTP 200,并且将调用您的成功 jQuery 回调。如果您的调用失败,则不仅仅是抛出异常并让 jQuery 在从服务器接收到 HTTP 500 后调用错误回调。

HTTP 状态代码是通知调用者调用是否因某种原因成功或失败的正确方法。

于 2011-06-24T22:36:37.020 回答
0

你为什么需要这个?创建您的自定义 ApplicationController 并从中派生所有控制器。在 ApplicationControllerJson<data>()中实现 data的方法

   public JsonResult Json<TData>(TData data, bool status) where TData : class
    {
        return Json(
            new
                {
                    data,
                    status
                },
            JsonRequestBehavior.AllowGet);
    }
于 2011-06-24T08:22:48.683 回答