在 ASP.net MVC 5 应用程序中单击按钮时使用 JavaScript/jQuery 将用户重定向到页面

Posted

技术标签:

【中文标题】在 ASP.net MVC 5 应用程序中单击按钮时使用 JavaScript/jQuery 将用户重定向到页面【英文标题】:Redirect user to a page using JavaScript/jQuery on button click in ASP.net MVC 5 application 【发布时间】:2017-05-28 03:25:37 【问题描述】:

我希望用户在提交表单后立即被重定向到不同的页面。我不关心调用控制器操作 httpost 时会发生什么。我只希望用户在单击按钮或提交表单后立即重定向页面。以下是我尝试过的,但它不起作用

cshtml文件sn-p

<script>
    $(document).ready(function () 
        $('#formSubmitButton').click(function () 
            debugger;
            // Neither works
             window.location.href = "/Home/Index"; 
            window.location.href = "https://www.google.com";


        );
    );
</script>

家庭控制器

   public ActionResult Index()
        
            return View();
        

实际的 httpost 控制器方法

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SavePayment(PaymentFormMV data)

    return View ("Hello")

我可以看到断点在 javascript 代码中被命中。但没有效果。此外,正常的 post 调用按预期进行,SavePayment 方法被调用,因此视图 hello 相应地被调用。为什么我无法在按钮单击时将用户重定向到索引页面。我知道 SavePayment 最终会被调用,但为什么重定向不起作用。我错过了什么吗?

编辑

这就是整个故事。客户正在付款,一些付款超时。当超时没有发生时,“Hello”重定向非常好。所以基本上如果超时发生在 2 分钟内。然后我会在将用户重定向到主页之前设置一个可能是 1.58 分钟的计时器。如果 post 方法返回成功,则“Hello.cshtml”将被调用。

但如果 IIS 服务器即将在 2 分钟后抛出 time out exception,那么我的 JavaScript 代码将在 IIS 启动之前超时(定时器设置为 1.58)并将用户重定向到主页。我希望最终会发生的 IIS 超时错误不会覆盖用户已安全重定向的主页。请指导我。底线我不希望 IIS 踢出用户。我没有在 JavaScript 代码 sn-p 中添加超时间隔代码,因为正常重定向本身不起作用。

【问题讨论】:

【参考方案1】:

因为,当您单击提交按钮时,表单已提交,HttpPost 操作方法将处理已发布的表单数据并返回一个 ViewResult(从“Hello”视图生成的 html 标记)返回。由于表单正在提交,它不会执行您设置window.location.href值的JS代码。

您应该在成功保存后在您的操作方法中进行重定向,例如 PRG 模式:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SavePayment(PaymentFormMV data)

    //do something
    return RedirectToAction("Index","Home"); 

如果您绝对想使用客户端脚本进行重定向,但希望表单被提交和处理(就像一个火忘记时尚),您可以考虑做一个 ajax 表单发布。

$('#formSubmitButton').click(function (e) 

   e.preventDefault();  // Prevent normal form submit

   var _form=$(this).closest("form");
   $.post(_form.attr("action"),_form.serialize(),function(res)
      // If you want to check the response and then do redirection
      // you should do it here. Make sure you return a json response from server then
   );
   window.location.href = "https://www.google.com";

);

编辑

根据相关编辑

这就是整个故事。客户正在付款和一些付款 正在超时。 “Hello”重定向在以下情况下非常好 超时没有发生。所以基本上如果超时发生在2 分钟。然后我会在 1.58 分钟前设置一个计时器 将用户重定向到主页。如果 post 方法返回成功,则 “Hello.cshtml”将被调用。但以防万一IIS服务器 即将抛出超时异常,这是在 2 分钟后然后我的 JavaScript 代码将在 IIS 退出之前超时(计时器中设置为 1.58) 并将用户重定向到主页。我希望 IIS 时间 最终会发生的错误不会覆盖主页 该用户已被安全重定向。底线我 不希望 IIS 踢出用户。我没有添加超时 JavaScript 代码中的间隔代码 sn -p 因为正常 重定向本身不起作用

我最初的反应是,不要在这样的用户线程上花费 2 分钟时间做任何事情。这不是一个好的用户体验。我不确定你从哪里得到 2 分钟的时间!但我建议你修复需要这么长时间的代码。您应该将其卸载为可能是一个 ajax 调用(参见上面的示例 ajax 代码),如果您没有收到 200 OK 响应(或您的 success 回调),您可以在客户端做一些事情(向用户显示一条消息所以他们可以再试一次)。这样您就可以避免使用本地 JavaScript 计时器。

底线是:修复需要 2 分钟以上的代码!可能有另一种方法可以解决您的问题/用例。

【讨论】:

这是 正确的 方法,但似乎 OP 想要离开页面并让表单发布自行消失。跨度> @nurdyguy:你是对的。 Shyju:你能看到编辑吗 一个小疑问。实际上,我的服务器端控制器调用会发生什么。我的意思是我在 1.58 之后将用户重定向到主页,但 IIS 服务器调用将继续进行,并在 2:00 时退出。那么这在现实世界中是如何运作的。我的意思是用户会看到 IIS 错误还是仍然在主页上? 或者假设没有发生超时,即使付款已经完成,那么用户是否会再次被重定向到 hello.cshtml? index.cshtml 是否会被 hello.cshtml 或 IIS 服务器超时错误页面覆盖。只是想知道?

以上是关于在 ASP.net MVC 5 应用程序中单击按钮时使用 JavaScript/jQuery 将用户重定向到页面的主要内容,如果未能解决你的问题,请参考以下文章

模型在按钮单击 ASP.NET MVC 5 时为空

C# & ASP.NET MVC 5 - 从按钮单击执行存储过程,没有返回值

在 ASP.NET MVC 中单击按钮时呈现部分视图

ASP.NET Core 2,使用没有 MVC 的 Razor 页面单击按钮

使用asp.net mvc在按钮单击成功时查看包消息无法正常工作?

在按钮单击文本框值是空的使用 asp.net mvc 显示警报?