#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. Не забудьте выполнить обработку ошибок при частичной обратной отправке!