gpt4 book ai didi

asp.net-mvc-3 - 使用 MVC 操作过滤器捕获 Ajax 请求中的重定向并返回 JsonResult

转载 作者:行者123 更新时间:2023-12-02 01:58:19 25 4
gpt4 key购买 nike

在我的 ASP.NET MVC 3 应用程序中,我有一些可以通过 Ajax 和非 Ajax 请求调用的操作方法。操作方法可能会返回 RedirectResult,并且我希望目标 URL 加载到浏览器中 - 即使对于 Ajax 请求也是如此。

我当前的解决方案是让操作方法调用 IsAjaxRequest 本身。如果为 false,则返回 RedirectResult。如果为 true,它会返回一个包含目标 URL 的 JsonResult,我在浏览器中有脚本来读取它并相应地设置 window.location。

我希望整理操作方法并在过滤器中处理它。我的问题是,除了 OnResultExecuted 之外,目标 URL (filterContext.HttpContext.Response.RedirectLocation) 在过滤器事件处理程序中为 null,并且在该处理程序中设置 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
};
}

最佳答案

以下是如何继续操作的示例:

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
}
}

关于asp.net-mvc-3 - 使用 MVC 操作过滤器捕获 Ajax 请求中的重定向并返回 JsonResult,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4971447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com