2008-12-31 3 views
1

У меня есть веб-страница, где он будет вводить файл excel/CSV от пользователя и считывать данные из него и импортировать в DB. Вставка каждой записи. Я просто хочу (Подробности: Клиентская информация об A добавляется ...)ASP.NET: показать статус состояния фона для пользователя

ответ

4

Попробуйте это ... Задайте вывод небуферизованным (Response.BufferOutput) и включите некоторый javascript в вашей страницы, которая обновляет пользовательский интерфейс, как вы сочтете нужным. Например, он может обновить SPAN с полным процентом или деталями обрабатываемой записи. Затем в коде сервера введите < скрипт > теги, которые вызывают функцию Javascript из переопределения Render. Убедитесь, что вы вызываете Flush() в соответствующие моменты времени, а также очищаете базовый код после его рендеринга ... Вызов функций JS должен быть отправлен в соответствующее время и выполнен на клиенте, в результате чего страница обновления.

Например ... Ваша страница HTML может выглядеть следующим образом:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title></title> 
    <script type="text/javascript"> 
     function UpdateScreen(t) { 
      document.getElementById('output').innerHTML = t; 
     } 
    </script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <div id='output'></div> 
    </div> 
    </form> 
</body> 
</html> 
<script type="text/javascript"> 
    UpdateScreen('hello'); 
</script> 

и ваш отделенный код будет выглядеть следующим образом:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Threading; 

namespace WebApplication1 
{ 
    public partial class _Default : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     protected override void Render(HtmlTextWriter writer) 
     { 
      Response.BufferOutput = false; 

      base.Render(writer); 
      Response.Flush(); 

      for (int i = 0; i < 10; i++) 
      { 
       Thread.Sleep(1000); 
       Response.Write(string.Format("<script type='text/javascript'>UpdateScreen('{0}');</script>", i * 10)); 
       Response.Flush(); 
      } 
     } 
    } 
} 
+0

Почему я должен переопределять метод визуализации? Мне нужно показать прогресс, в то время как цикл for ierer каждый раз повторяется – Shyju

+0

Если вы делаете это во время Page_Load, то основное содержимое не было отправлено клиенту. Вот почему нам еще нужно вызвать base.Render (...) в нашем переопределении - чтобы получить реальный контент для клиента. Render - это, в основном, последняя часть жизненного цикла страницы для выполнения. –

+0

Вот полезный обзор жизненного цикла страницы: http://www.robincurry.org/blog/content/binary/o_aspNet_Page_LifeCycle.jpg –

0

Я знаю, что это старый вопрос, и владелец из этого, возможно, двинулся на долгое время назад. Во всяком случае:

Предлагаемое решение не будет работать на ASP.NET MVC. И если вы спросите меня, что вы этого не сделаете, я скажу, что это не самое чистое решение проблемы:

+0

Кстати, не то, что они плохие ответы, но IFrame один почти ТОЧНО так же, как и мое решение, за исключением того, что он, видимо, делает это с помощью Page_Load (возможно, мой комментарий об использовании Render ошибочен). JQuery - это опрос, что означает, что у вас должен быть какой-то механизм для получения состояния из процесса, который его запускает, что также не обязательно тривиально. –

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