2016-06-15 6 views
0

У меня есть метод действий, который устанавливает сообщение для ViewBag и возвращается к HomePage, как,Показать 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 для HomePage, оно должно отображаться на текущей странице.

+1

Единственный способ остаться на одной странице - использовать ajax. (нет смысла помещать что-либо в «ViewBag», а затем перенаправлять - его сразу же потерять) –

+0

@StephenMuecke Могу ли я перенаправить (сразу или после некоторой задержки) на другую страницу в некотором ответе с помощью Ajax и JQuery? – Nis

+0

Вы можете сделать ajax-вызов, получить ответ, чтобы обновить существующую страницу и использовать таймер javascirpt для перенаправления через 2 секунды, но почему? Чего вы пытаетесь достичь? –

ответ

0

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

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

window.setTimeout(function(){ 
window.location.href='your URL'; 
}, 2000); 
0

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

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

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

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

Установите элемент HTML, чтобы показать это сообщение, и используйте тайм-аут JS o п текущий вид 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.

Смежные вопросы