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

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

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

关于c# - ASP.NET MVC Ajax Actions 结果封装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3140169/

相关文章:

c# - 具有类似于 Timer.Tick 的事件的精确计时器

asp.net-mvc - Controller 相当于 ASP.NET MVC 中的 HttpContext.Current

PDF 加载后的 jQuery 事件?

ajax - CakePHP:在 ajax 之后呈现 View

c# - 将记录类型与 C# 中的 LINQ 进行比较

c# - 无法加载文件或程序集“Microsoft.VisualStudio.VC.Interfaces

javascript - 用ajax提交后替换表单

ajax - Blobstore 上传 + Ajax/替代

c# - 像 Java (JSF) 中的 Devexpress 组件?

asp.net-mvc - MVC 数据访问