Как мне выполнить частичную обратную публикацию после загрузки страницы на клиенте?

#asp.net #ajax #asp.net-ajax

#asp.net #ajax #asp.net-ajax

Вопрос:

У меня есть некоторая обработка, которая может занять до 5 секунд при первой загрузке страницы на сервер. Это внешнее ограничение, которое находится вне моего контроля, и поскольку это происходит в веб-части, которая может быть добавлена на любую страницу на серверах, находящихся вне моего контроля, я не могу выполнить эту обработку в более широкой области, такой как приложение.

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

Я пробовал использовать ajax-таймер, который работает хорошо, за исключением случаев, когда в коде, стоящем за обратной отправкой, возникает исключение.

В заключение я хотел бы знать, как выполнить частичную обратную отправку один и только один раз, как только страница загрузится на клиенте.

Ответ №1:

Я понял это. Чтобы частично выполнить обратную передачу на сервер через UpdatePanel без использования скрытых элементов управления, сделайте это с помощью jQuery:

 <script type="text/javascript">
    $(document).ready(function () {
        __doPostBack('<%=UpdatePanel1.ClientID %>');
    });
</script>
  

Это позволит выполнить частичную обратную отправку на сервер для UpdatePanel с идентификатором UpdatePanel1, как только HTML DOM будет готов. Затем вы можете использовать ASP.NET жизненный цикл страницы для подключения к любому событию, подходящему для вас. Я подключился к событию загрузки панели обновления:

 protected void UpdatePanel1_Load(object sender, EventArgs e)
{
    if (Page.IsPostBack amp;amp; Session["InitializedKey"] == null)
    {
        Session["InitializedKey"] = true;
        // do your initialization stuff here
    }
}
  

Приведенный выше код будет выполняться только в том случае, если страница отправляется обратно и установлена переменная сеанса. Теперь вам нужно очистить переменную сеанса, когда пользователь обновляет страницу, поскольку цель здесь состоит в том, чтобы запустить этот код при первой обратной передаче и только при первой обратной передаче. Итак, очистите переменную сеанса в Page_Load:

 protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
        Session[initializedKey] = null;
}
  

И если вы хотите отображать индикатор выполнения, пока страница находится в режиме частичной обратной отправки, выполните этот javascript:

 <script type="text/javascript">
    var prm = Sys.WebForms.PageRequestManager.getInstance();
    prm.add_beginRequest(BeginRequestHandler);
    prm.add_endRequest(EndRequestHandler);
    function BeginRequestHandler(sender, args) {
        if (args._postBackElement.id == '<%=UpdatePanel1.ClientID %>') {
            $get('Progress').className = 'Progress';
        }
    }
    function EndRequestHandler(sender, args) {
        if (sender._postBackSettings.sourceElement.id == '<%=UpdatePanel1.ClientID %>') {
            $get('Progress').className = 'Hidden';
        }
    }
</script>
  

Для этого требуется тег div с идентификатором ‘Progress’ и все, что вы хотите показать для прогресса в этом div. Вам также понадобится некоторый css для настройки отображаемого и видимого стилей в теге div в классах с именами Hidden и Progress. Не забудьте выполнить обработку ошибок при частичной обратной отправке!