在MVC中捕获form.submit()响应

时间:2011-06-30 06:53:45

标签: asp.net-mvc model-view-controller

提交表单(form.submit()且没有ajax)时,有没有办法检测响应是否回来(假设未加载新页面)。从控制器我实际上是返回一个文件而不是一个新的视图。

查看:

<% using (Html.BeginForm()){%>
   ....
   <input id="submitsearch" type="submit" value="DownloadFile" name="SubmitButton" />
<%} %>

控制器:

return File(FileContent, "text/plain", Filename);

基本上我想要发生的是,当用户点击提交时,我会显示一个加载图标,当出现下载弹出窗口时,我想删除加载图标。

所以我实际上不需要阅读响应,但只知道响应何时返回,这样我就可以删除加载图标。

限制是我不能使用ajax调用来提交页面。

干杯。

2 个答案:

答案 0 :(得分:5)

您可以使用我称之为 cookie polling 的技术:

<% using (Html.BeginForm("Download", "Home")) { %>
    <%= Html.Hidden("downloadToken", DateTime.Now.Ticks) %>
    <input type="submit" value="Download" />
<% } %>

<script src="<%= Url.Content("~/Scripts/jquery.cookie.js") %>" type="text/javascript"></script>
<script type="text/javascript">
    $('form').submit(function () {
        // We start a download => show some progress indicator here
        $(':submit', this).val('Please wait while downloading...').attr('disabled', 'disabled');

        // start polling for the cookie every 500ms
        var fileDownloadCheckTimer = window.setInterval(function () {
            var cookieValue = $.cookie('fileDownloadToken');
            var token = $('#downloadToken').val();
            if (cookieValue == token) {
                // The download has finished => remove the progress indicator
                $(':submit', $('form')).val('Download').removeAttr('disabled');

                // remove the cookie
                $.cookie('fileDownloadToken', null);

                // stop polling
                window.clearInterval(fileDownloadCheckTimer);
            }
        }, 500);
    });
</script>

并在控制器操作中:

public ActionResult Download(string downloadToken)
{
    // Simulate a slow download
    Thread.Sleep(5000);
    var cookie = new HttpCookie("fileDownloadToken", downloadToken);
    // set the cookie with the proper value
    Response.AppendCookie(cookie);
    return File(Encoding.UTF8.GetBytes("foo bar"), "text/plain", "foo.txt");
}

答案 1 :(得分:0)

如果你不能使用ajax,你可以返回一个带有文件下载链接的视图。但是如果没有ajax,你将不得不进行整页重新加载......