gpt4 book ai didi

asp.net-mvc - 有没有办法跨 RedirectToAction 维护 IsAjaxRequest()?

转载 作者:行者123 更新时间:2023-12-04 17:28:55 25 4
gpt4 key购买 nike

如果您不想要任何上下文或我为什么需要它的示例,请跳至底部的问题!

为了保持整洁,我最初构建我的应用程序时没有使用 JavaScript。我现在正尝试在其顶部添加一层不显眼的 JavaScript。

本着 MVC 的精神,我利用了您可以使用 RedirectToAction() 之类的简单路由和重新路由。 .

假设我有以下 URL 来启动注册过程:

http://www.mysite.com/signup



假设注册过程有两个步骤:

http://www.mysite.com/signup/1
http://www.mysite.com/signup/2



假设我希望,如果启用了 JavaScript,则注册表单会出现在诸如厚框之类的对话框中。

如果用户在第 2 步离开注册过程,但后来单击“注册”按钮,我想要这个 URL:

http://www.mysite.com/signup



执行一些业务逻辑,检查 session 。如果他们在中途放弃了之前的注册工作,那么我想提示他们恢复或重新开始。

我最终可能会使用以下方法:
public ActionResult SignUp(int? step)
{
if(!step.HasValue)
{
if((bool)Session["SignUpInProgress"] == true)
{
return RedirectToAction("WouldYouLikeToResume");
}
else
{
step = 1;
}
}
...
}

public ActionResult WouldYouLikeToResume()
{
if(Request.IsAjaxRequest())
{
return View("WouldYouLikeToResumeControl");
}
return View();
}

WillYouLikeToResume 中的逻辑是:
  • 如果是 AJAX 请求,则只返回用户控件,或“部分”,以便模态弹出框不包含母版页。
  • 否则返回普通 View

  • 但是,这会失败,因为一旦我重定向出 SignUp, IsAjaxRequest()变成假的。

    显然有很简单的方法可以解决这个特定的重定向,但我想在全局范围内保持对 Ajax 请求的了解,以在我的站点上解决这个问题。

    问题:

    ASP.NET MVC 非常非常可扩展。

    是否可以拦截对 RedirectToAction 的调用?并在参数中注入(inject)类似“isAjaxRequest”的东西?

    或者

    有没有其他方法可以安全地检测到发起调用是 AJAX 调用?

    或者

    我会以完全错误的方式解决这个问题吗?

    最佳答案

    根据@joshcomley 的要求,使用 TempData 方法的自动答案:

    这假设您有一个 BaseController 并且您的 Controller 从它继承。

    public class AjaxianController : /*Base?*/Controller
    {
    private const string AjaxTempKey = "__isAjax";


    public bool IsAjax
    {
    get { return Request.IsAjaxRequest() || (TempData.ContainsKey(AjaxTempKey)); }
    }


    protected override RedirectResult Redirect(string url)
    {
    ensureAjaxFlag();
    return base.Redirect(url);
    }

    protected override RedirectToRouteResult RedirectToAction(string actionName, string controllerName, System.Web.Routing.RouteValueDictionary routeValues)
    {
    ensureAjaxFlag();
    return base.RedirectToAction(actionName, controllerName, routeValues);
    }

    protected override RedirectToRouteResult RedirectToRoute(string routeName, System.Web.Routing.RouteValueDictionary routeValues)
    {
    ensureAjaxFlag();
    return base.RedirectToRoute(routeName, routeValues);
    }


    private void ensureAjaxFlag()
    {
    if (IsAjax)
    TempData[AjaxTempKey] = true;

    else if (TempData.ContainsKey(AjaxTempKey))
    TempData.Remove(AjaxTempKey);
    }
    }

    要使用它,请让您的 Controller 从 AjaxianController 继承并使用“IsAjax”属性而不是 IsAjaxRequest 扩展方法,然后 Controller 上的所有重定向将自动维护 ajax-or-not 标志。

    ...

    不过还没有测试过,所以要小心错误:-)

    ...

    另一种不需要使用我能想到的状态的通用方法可能需要您修改路由。

    具体来说,您需要能够在您的 route 添加一个通用词,即
    {controller}/{action}/{format}.{ajax}.html

    然后不是检查 TempData,而是检查 RouteData["ajax"]。

    在扩展点上,您无需设置 TempData 键,而是将“ajax”添加到您的 RouteData 中。

    this question on multiple format route了解更多信息。

    关于asp.net-mvc - 有没有办法跨 RedirectToAction 维护 IsAjaxRequest()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1294306/

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