Диалоговое окно подтверждения Javascript — ASP.NET

Я видел пару похожих вопросов по той же теме, но ни один из них не касался моей проблемы.

У меня есть веб-сайт asp.net, и я хочу показать пользователю сообщение о состоянии (asp:метка, которая исчезнет через 5 секунд) после обновления базы данных.

Я хочу присвоить текст ярлыку, а затем скрыть его с помощью Javascript.

Я разобрался с частью js, единственная проблема заключается в том, как мне вызвать функцию js после того, как я назначил текст элементу управления?

скажем, я обновляю что-то в базе данных с помощью следующего кода:

<asp:Button ID="btnUploadFiles" runat="server" OnClick="buttonSubmit_Click" Text="Update"  />

Код позади

protected void buttonSubmit_Click(object sender, EventArgs e)
    { try{// update the database  
          // change label text to tell the user update succeeded}
      catch(Exception ex){...}
    }

пожалуйста помоги!

ОБНОВЛЕНИЕ: пожалуйста, не используйте jquery, просто javascript


person roman m    schedule 07.02.2009    source источник
comment
Перечисленные здесь решения, отличные от jquery, могут закончиться неудачей, потому что DOM не загружается, когда вы пытаетесь скрыть элемент. Вам лучше использовать фреймворк, даже если вы еще не знаете его.   -  person tvanfosson    schedule 08.02.2009
comment
Если вы не хотите использовать фреймворк или писать эквивалентный код, вы должны по крайней мере поместить скрипт внизу страницы (а не в заголовке) и чтобы он запускался после того, как весь HTML был проанализирован. Вероятно, в данном случае это будет надежно работать, хотя и не для всех типов манипуляций.   -  person tvanfosson    schedule 08.02.2009


Ответы (3)


Чтобы ответить на ваш вопрос «Как мне вызвать функцию js после того, как я назначил текст элементу управления?». Вы можете просто добавить вызов «RegisterClientScriptBlock» внутри события нажатия кнопки, чтобы вывести JavaScript, предоставленный Люком.

protected void buttonSubmit_Click(object sender, EventArgs e)
{ 
    try
    {
       // update the database  
       // change label text to tell the user update succeeded
       label.Text = "Message";
       string js = "function hideLabel(){document.getElementById('" + label.ClientID + "').style.display = 'none'};setTimeout(hideLabel, 5000);"
       ClientScript.RegisterClientScriptBlock(this.GetType(), "test", js ,true);
    }
    catch(Exception ex){...}
}
person Phaedrus    schedule 08.02.2009
comment
Если вы собираетесь зарегистрировать его в отделенном коде, вы должны по крайней мере использовать идентификатор клиента из элемента управления вместо его жесткого кодирования. - person tvanfosson; 08.02.2009

Лично я бы использовал для этого jQuery, но если вы хотите использовать простой старый JavaScript, то, вероятно, подойдет что-то вроде этого Хитрость:

<script type="text/javascript">
function hideLabel()
{
    // replace yourLabelID with <%=YourLabelID.ClientID%> if it's a .NET Label control
    document.getElementById('yourLabelID').style.display = 'none';
}
setTimeout('hideLabel()', 5000);
</script>

При необходимости вы также можете встроить блок сценария в элемент управления Literal и сделать его видимым только при обновлении текста метки.

person LukeH    schedule 07.02.2009
comment
Вам не нужно передавать 'hideLabel()' в виде строки. Вместо этого вы можете передать setTimeout ссылку на функцию: setTimeout(hideLabel, 5000);. В данном случае это не имеет большого значения, так как это одноразовый вызов с константой, но лучше избегать выполнения строк. - person Matthew Crumley; 08.02.2009
comment
@ Мэтью, ты абсолютно прав. Я писал пример с головы до головы и не был уверен, есть ли у нестроковой версии какие-либо потенциальные проблемы с совместимостью с браузером, поэтому я подумал, что лучше быть осторожным. - person LukeH; 08.02.2009

Вы отправляете ответ через Ajax или обычный постбэк? Если это обычная обратная передача, просто зарегистрируйте какой-нибудь javascript на странице, который устанавливает таймер и вызывает вашу функцию, которая скрывает метку после истечения времени таймера. В следующем примере используется jQuery, чтобы убедиться, что DOM загружается до запуска таймера, но есть и другие способы. Он скроет метку по истечении 5 секунд.

function hideLabel(label)
{
   $(label).hide();
}

$(document).ready( function() {
    var label = $('#labelID');
    setTimer(function() { hideLabel(label); ),5000);
});

Идея в основном такая же, если вы используете AJAX, за исключением того, что вы устанавливаете таймер в обратном вызове onSuccess для вызова AJAX, а не при загрузке документа.

person tvanfosson    schedule 07.02.2009