Показать сообщение ViewBag на несколько секунд, а затем перенаправить на другое действие

У меня есть метод действия, который устанавливает сообщение в ViewBag и возвращает на домашнюю страницу, например,

 ViewBag.errormsg = "Some Temporary message";
 return RedirectToAction("Index", "Dashboard");

В соответствии с этим подходом пользователь не сможет увидеть ViewBag.errormsg на этой странице, потому что он немедленно перенаправляется на панель инструментов, но я хочу показать это сообщение в течение 1-2 секунд, а затем после перенаправления на панель инструментов.

Я попытался использовать метод Task.WaitAll();, чтобы отложить вызов RedirectToAction, как здесь,

ViewBag.errormsg = "Some Temporary message";
Task.WaitAll(Task.Delay(2000));
return RedirectToAction("Index", "Dashboard");

Но это довольно глупая работа, что ViewBag не будет показывать сообщение, пока не будет вызван метод возврата. Есть ли простой способ сделать это?

Я думаю, что TempData не подходит в моем случае, потому что я не хочу показывать это сообщение ViewBag на домашней странице, оно должно отображаться на текущей странице.


person Nis    schedule 15.06.2016    source источник
comment
Единственный способ оставаться на той же странице — использовать ajax. (нет смысла помещать что-либо в ViewBag, а затем перенаправлять - он сразу теряется)   -  person    schedule 15.06.2016
comment
@StephenMuecke Могу ли я перенаправить (сразу или после некоторой задержки) на другую страницу в каком-то ответе с помощью Ajax и Jquery?   -  person Nis    schedule 15.06.2016
comment
Вы можете сделать вызов ajax, получить ответ на обновление существующей страницы и использовать таймер javascirpt для перенаправления через 2 секунды, но зачем? Чего вы пытаетесь достичь?   -  person    schedule 15.06.2016
comment
Это запрос, который пользователь вводит что-то. Если это правильно, я хочу показать какое-то сообщение на той же странице, а затем перенаправить на домашнюю страницу, я могу показать сообщение на домашней странице, используя TempData, но это не будет выглядеть лучше, оно должно отображаться в той же странице, затем перенаправить на домашнюю страницу.   -  person Nis    schedule 15.06.2016
comment
Затем сделайте вызов ajax. Но похоже, что вы что-то проверяете, и в этом случае используйте атрибут проверки.   -  person    schedule 15.06.2016
comment
Это не проверка, это случай смены пароля. Если он был изменен, то Показать пароль успешно изменен, а затем перенаправить на домашнюю страницу, я также попробую ajax. Спасибо вам большое за ваше время. Не могли бы вы подсказать, как бы вы поступили в подобных ситуациях?   -  person Nis    schedule 15.06.2016
comment
Как вы думаете, почему вам нужно это делать? В случае успеха пользователь перенаправляется, и они знают, что это было успешно. Если нет, то вы возвращаете представление с сообщением об ошибке, чтобы они знали, что это не так.   -  person    schedule 15.06.2016
comment
@StephenMuecke хе-хе, верно, но я подумал, что лучше сообщить, что пароль был изменен, если это так, я оставлю все как есть, пока не появятся другие требования, спасибо ..   -  person Nis    schedule 15.06.2016


Ответы (2)


Вы не сможете сделать это на стороне сервера, вам придется использовать javascript.

Вы можете использовать:

window.setTimeout(function(){
window.location.href='your URL';
}, 2000);
person user3378165    schedule 15.06.2016

Я понял, какой процесс вы хотите сделать:

Controller => Current view => Redirect => Dashboard view

Во-первых, включите ваше сообщение в текущий вид:

ViewBag.errormsg = "Some Temporary message";
return View("CurrentView");

Установите элемент HTML для отображения этого сообщения и используйте время ожидания JS для текущего представления CSHTML:

<script type="text/javascript">
function onMessageShow() {
    var msg = "@ViewBag.errormsg";
    // if the message exists, set redirection to dashboard page
    if (msg != null || typeof msg !== "undefined") {
         setTimeout('redirect', 5000); // 5 seconds for example
    }
}

function redirect() {
    window.location.href = "@Url.Content("Index", "Dashboard")";
    // or use window.location.replace, depending what your need
}
</script>

<html>
<body onload="onMessageShow()">
    <!-- simplified for brevity -->
    <p>@ViewBag.errormsg</p>
    <!-- simplified for brevity -->
</body>
</html>

Task.WaitAll с Task.Delay используются вместе на стороне сервера для задержки выполнения процесса на стороне сервера (включая процессы async), в вашем случае есть события на стороне клиента, которые перенаправляют на страницу индекса после появления сообщения.

CMIIW.

person Tetsuya Yamamoto    schedule 15.06.2016