Получение ответа form.submit () в MVC - PullRequest
2 голосов
/ 30 июня 2011

При отправке формы (form.submit () и без ajax), есть ли способ определить, вернулся ли ответ (при условии, что новая страница не загружена). Из контроллера я на самом деле возвращаю файл, а не новый View.

Вид:

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

Контроллер:

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

По сути, я хочу, чтобы, когда пользователь нажимает кнопку «Отправить», я отображал значок загрузки, а когда появляется всплывающее окно загрузки, я хочу удалить значок загрузки.

Так что мне на самом деле не нужно читать ответ, а просто знать, когда ответ возвращается, чтобы я мог удалить значок загрузки.

Ограничение: я не могу использовать ajax-вызов для отправки страницы.

Приветствие.

Ответы [ 2 ]

5 голосов
/ 30 июня 2011

Вы можете использовать технику, которую я называю опрос cookie :

<% 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");
}
0 голосов
/ 30 июня 2011

Если вы не можете использовать ajax, вы можете просто вернуть View со ссылкой на скачивание файла.Но без ajax вам придется выполнить полную перезагрузку страницы ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...