Skip to main content
 首页 » 编程设计

c#之ASP.NET MVC Ajax Actions 结果封装

2024年01月12日35mayingbao

我希望将 ASP.NET MVC 上的任何 AJAX 调用的每个结果都封装到一个 JSON 对象中,该对象应该是这样的: AjaxResult { 状态,数据 }

其中状态将包含一个枚举值,描述调用是否成功、错误、身份验证过期等。这将使客户端代码能够重定向到登录页面等。

我尝试通过覆盖 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 }; 
        } 
    } 
} 

请您参考如下方法:

为什么需要这个? 创建您的自定义 ApplicationController 并从中派生所有 Controller 。 在 ApplicationController 中实现方法 Json<data>()哪里的数据

   public JsonResult Json<TData>(TData data, bool status) where TData : class 
    { 
        return Json( 
            new 
                { 
                    data, 
                    status 
                }, 
            JsonRequestBehavior.AllowGet); 
    }