Я хотел бы, чтобы каждый результат любого вызова 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 };
}
}
}