1

我有一个 ASP.NET MVC 4 应用程序,它有一个部分的行为类似于 SPA。这是一个包含多个步骤的页面,因为我正在无会话工作,所以我正在从客户端向服务器(使用 AJAX)发送每个请求中的实体 ID(我还发送了一个需要对应的 GUID ID 是有效的,这是为了检测数据篡改)。假设用户在第 3 步并且发生以下情况之一: 1) 发生错误:我有一个继承自 HandleErrorAttribute 的全局过滤器,它记录错误并发送电子邮件,毕竟它显示了一个自定义错误页。问题是,如果用户按下浏览器的后退按钮,隐藏字段就会丢失,流程必须从第 1 步重新开始。2) 用户离开页面。

提前致谢。

编辑:

当用户想要离开时,我会显示一个警告对话框。

$(window).bind('beforeunload', function () {
        if ($("#id").val() != "") {
            return 'If you leave the page, the offer will be lost.';
        }
    });

如果在他离开后按下浏览器的后退按钮,我会将他重定向到流程的第一步,因为之前输入的数据丢失了。

if ($("#id").val() == "" && window.location.hash != "") {
        window.location.hash = "";
    }
4

1 回答 1

1

听起来您对下一步的 AJAX 请求正在点击将您重定向到新页面的控制器操作。这很好,通过将所有相关信息发送回控制器为每个步骤保持服务器代码无状态也很好。但是,这样做意味着您无法使用自定义错误页面,并且您将无法使其与您的设置正常工作。

我的建议:朝着真正的 SPA 迈进。当我访问 Step1 时,控制器应该发回整个页面(就像你正在做的那样)。让我们假设这个页面有一个像<div id="step-container"> ... HTML for each step is in here ... </div>.

现在,当您单击按钮继续执行第 2 步时,不要点击期望重定向到新页面的控制器操作,而是发送 AJAX 请求以获取包含第 2 步内容的部分视图。

在服务器上,将您Step2.cshtml的常规视图更改为部分视图(您可以创建一个新视图并单击“部分视图”复选框),为了惯例,您可能应该将其重命名为_Step2.cshtml. 在您的 Controller actionpublic ActionResult Step2(... data)中,您可以将您的 return 语句更改为return PartialView("_Step2"),但保留它就return View("_Step2")可以了。

现在是重要的部分,客户。在这里,您正在为该部分视图发出 AJAX 请求。

// Set the data from your form in this variable
var data = { };

// Issue a GET request out to the controller action.  Make sure the URL is right
$.get('/Steps/Step2', data)
    .done(function(result) {
        // This promise will execute when we get the content of the Partial View back from the server
        // The result variable should have the HTML for the view

        // Use jQuery to set the content in your step div to the new HTML
        $('#step-container').html(result);
    })
    .fail(function(error) {
        // This promise function will execute if there is an error in the Controller 
        // and it returns something other than a 200 type response code

        // Handle the error here, maybe showing a dialog or trying to fix the error
        alert('Sorry, form submission failed');
    });
于 2014-06-06T19:24:27.757 回答