ASP.NET MVC Ajax Действия результатов - PullRequest
2 голосов
/ 29 июня 2010

Я хотел бы, чтобы каждый результат любого вызова AJAX в ASP.NET MVC был конвертирован в объект JSON, который должен выглядеть следующим образом: AjaxResult {status, data}

, где status будет содержать значение перечисленияописание того, был ли вызов успешным, ошибочным, аутентификация истекла и т. д. Это позволит клиентскому коду перенаправить на страницу входа в систему и т. д.

Я попытался перехватить Ajax-запросы, переопределив OnActionExecuted, и попытался отрендеритьвозвращается соответствующим результатом действия с использованием следующего кода, но это решение работает медленно.У тебя есть идея получше?

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 голосов
/ 25 июня 2011

Вам действительно нужно это делать вообще?

Если ваш вызов ajax завершится успешно, будет возвращен HTTP 200 и будет вызван ваш успешный обратный вызов jQuery.Если ваш вызов не удался, просто сгенерируйте исключение и позвольте jQuery вызвать обратный вызов ошибки после того, как он получил HTTP 500 от сервера.

Коды состояния HTTP являются надлежащим способом информирования вызывающего абонента о том, был ли вызов успешным или неудачным дляопределенная причина.

0 голосов
/ 24 июня 2011

зачем тебе это? Создайте свой собственный ApplicationController и извлеките все контроллеры из этого. В ApplicationController реализован метод Json<data>(), где данные

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