ASP.NET MVC Ajax Actions结果包络

时间:2010-06-29 11:26:24

标签: c# asp.net-mvc ajax json controllers

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

2 个答案:

答案 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状态代码是通知呼叫者的正确方法。