在我的ASP.NET MVC 3应用程序中,我有一些可以使用Ajax和非Ajax请求调用的操作方法.操作方法可以返回RedirectResult,我希望在浏览器中加载目标URL - 即使对于Ajax请求也是如此.
我目前的解决方案是使用action方法调用IsAjaxRequest本身.如果为false,则返回RedirectResult.如果为true,则返回包含目标URL的JsonResult,并且我在浏览器中有脚本来读取它并相应地设置window.location.
我希望整理动作方法并在过滤器中处理它.我的问题是目标URL(filterContext.HttpContext.Response.RedirectLocation)在OnResultExecuted以外的过滤器事件处理程序中为空,并且在该处理程序中设置filterContext.Result(并且更改response.StatusCode)不能成功发出JSON响应.
如果我使用其他处理程序之一,例如OnActionExecuted,我可以更改响应以发出JSON,但无法获取目标URL.
两步过程也不起作用 - 如果我在OnActionExecuted中将结果更改为JsonResult,则OnResultExecuted中的RedirectLocation为null.
任何人都可以重新创建此问题或建议更好的解决方案?谢谢.
PS这里是来自OnResultExecuted的代码:
if ((filterContext.Result is RedirectToRouteResult ||
filterContext.Result is RedirectResult) &&
filterContext.HttpContext.Request.IsAjaxRequest())
{
string url = filterContext.HttpContext.Response.RedirectLocation;
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.OK;
filterContext.HttpContext.Response.RedirectLocation = "";
filterContext.Result = new JsonResult
{
Data = new { Redirect = url },
ContentEncoding = System.Text.Encoding.UTF8,
ContentType = "application/json",
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
Run Code Online (Sandbox Code Playgroud)
Dar*_*rov 15
以下是您可以继续操作的示例:
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
string url = "/";
var redirectResult = filterContext.Result as RedirectResult;
if (filterContext.Result is RedirectResult)
{
// It was a RedirectResult => we need to calculate the url
var result = filterContext.Result as RedirectResult;
url = UrlHelper.GenerateContentUrl(result.Url, filterContext.HttpContext);
}
else if (filterContext.Result is RedirectToRouteResult)
{
// It was a RedirectToRouteResult => we need to calculate
// the target url
var result = filterContext.Result as RedirectToRouteResult;
url = UrlHelper.GenerateUrl(result.RouteName, null, null, result.RouteValues, RouteTable.Routes, filterContext.RequestContext, false);
}
filterContext.Result = new JsonResult
{
Data = new { Redirect = url },
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
else
{
// TODO: It is not an AJAX request => do whatever you were doing
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8396 次 |
| 最近记录: |