Подтвердить что ты не робот

Использование page.ClientScript.RegisterClientScriptBlock не работает

Я пытаюсь запустить всплывающее окно, как показано ниже, но оно не работает. Пожалуйста, помогите

public void btnSubmit_Click(Object o, EventArgs e)
{
    if (checkFileExists(Convert.ToString(fileInfo)))
    {
        Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "Msg", "<script type=\"text/javascript\"  language=\"javascript\">function showMsg(){return confirm(\"This image name already exists, do you want to replace it?\");}</script>", true);
        btnSubmit.OnClientClick = "return showMsg()";
    }
    if (something else)
    {
        // It does whatever is here but never pops the question above
    }
}

а на кнопке у меня

 <asp:Button class="Button" ID="btnSubmit" CausesValidation="True" Text="SUBMIT" runat="server"
             OnClick="btnSubmit_Click"></asp:Button>
4b9b3361

Ответ 1

Последний параметр, который вы отправляете на RegisterClientScriptBlock, это true, который сообщает методу обернуть ваш script в блок <script>, но вы уже это делаете. Вероятно, он не работает, поскольку он отображает недействительные (т.е. Вложенные) теги script.

Ответ 2

Другая причина, по которой не работает страница .ClientScript.RegisterClientScriptBlock, заключается в том, что страница не имеет формы на стороне сервера, например. <form id="form1" runat="server">... </form>

Ответ 3

ОБНОВЛЕННЫЙ ОТВЕТ (в ответ на комментарии OP)

Вся парадигма "вы уверены" может быть немного раздражающей для реализации в ASP.NET. Здесь подход, который я использовал для его решения. Я уверен, что есть много других способов сделать это, некоторые из которых более элегантны. Но в любом случае...

  • Поместите asp: Скрытое поле в вашей форме, чтобы указать "пользователь уверен". Установите для значения по умолчанию значение false.
  • Определите функцию showMsg() javascript непосредственно в файле .ASPX. Он всегда может быть на странице, готовой к стрельбе; вам не нужно или нужно условно добавлять его через RegisterClientScript. Вам также необходимо усилить эту функцию, чтобы сделать 2 вещи, если пользователь подтвердит "да, я уверен": a) установите для asp: Hidden field значение true; б) представить форму.
  • Внесите свою функцию btnSubmit_Click(), чтобы проверить asp: Скрытое значение: если это значение истинно, вы знаете, что пользователь уже подтвердил диалог "вы уверены" , чтобы вы могли выполнить свою операцию (и скрытое значение обратно на false до "reset" ). Если значение asp: Hidden равно false, запустите свой RegisterClientScript, чтобы вызвать (не определять, а фактически вызывать) вашу функцию showMsg().
  • Реализовать Page_LoadComplete, чтобы проверить скрытое значение: если оно истинно, программно вызывать btnSubmitClick()

При внесенных выше изменениях ваша страница должна вести себя примерно так:

  • Пользователь нажимает "Отправить", сообщения страницы возвращаются.
  • btnSubmit_Click выполняется, видит, что скрытое поле ложно, и устанавливает RegisterClientScript для вызова showMsg().
  • Page_LoadComplete видит, что скрытое поле ложно, поэтому ничего не делает. Postback завершается, и страница отправляется обратно в браузер.
  • Браузер анализирует страницу, приходит в showMsg() и запускает ее. Появится диалоговое окно "Вы уверены".
  • Пользователь нажимает "да" в диалоговом окне "Вы уверены". Обновленная функция showMsg обнаруживает это, устанавливает скрытое поле в true и отправляет форму. Обратная связь по страницам.
  • Поскольку форма была отправлена ​​обратно, но кнопка отправки не была нажата, ваша функция btnSubmit_Click НЕ вызывается здесь.
  • Page_LoadComplete видит, что скрытое поле истинно, поэтому оно вызывает функцию btnSubmit_Click.
  • btnSubmit_Click видит, что скрытое поле истинно и выполняет реальную операцию.

Вышеупомянутый подход определенно тяжело. Если вы хотите использовать ajax для принятия решения о необходимости "вы уверены" , вы можете переместить намного больше этой логики на клиентскую сторону и сэкономить себе операцию обратной передачи.

Однако, тяжелый или нет, вышеупомянутый подход будет работать и приведет к относительно легкому поддержанию кода, если вы добавите некоторые хорошие комментарии.

ОРИГИНАЛЬНЫЙ ОТВЕТ:

Как указано в настоящее время, showMsg() не будет вызываться до тех пор, пока второй раз пользователь не нажмет кнопку "Отправить":

  • Кнопка отображается без значения OnClientClick.
  • Пользователь нажимает кнопку отправки; page posts-back.
  • Обработчик событий ставит определение "function showMsg()" на странице (registerClientScript); он также добавляет атрибут OnClientClick к кнопке. Postback завершается, и страница перерисовывается в браузере.
  • , showMsg() не был вызван кем-либо.
  • Пользователь нажимает кнопку отправки.
  • Так как кнопка теперь имеет значение OnClientClick, на этот раз ему следует вызвать showMsg.

Другие вещи, которые следует учитывать:

У вас есть фактическое определение функции javascript в вашем RegisterClientScript. Почему бы просто не определить его на странице (в файле .aspx)? Ничего не повредит, чтобы всегда иметь его там. Он не срабатывает, пока он не вызвал.

Я не знаком с обозначением double-parens, которое вы используете: "GetType()()" - если это не вызывает ошибку компилятора или не бросает, это может быть неактуально.

Определенно ознакомьтесь с Firebug и/или Fiddler, так что вы можете точно увидеть, какой визуализированный HTML отправляется обратно в браузер. Это облегчит вашу отладку веб-разработки MUCH.

Ответ 4

Я понимаю вашу проблему, и я предлагаю вам сделать следующее.

1- сохраняйте свой btSubmit, но в своем

public void btnSubmit_Click(Object o, EventArgs e)
{
   if (checkFileExists(Convert.ToString(fileInfo)))
   {
        Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "Msg", "<script type=\"text/javascript\"  language=\"javascript\">function showMsg(){return confirm(\"This image name already exists, do you want to replace it?\");}</script>", true);
        btnSubmit.OnClientClick = "return showMsg()";
   }    
}

удалить if (что-то еще).

2- Используйте Dialog, чтобы создать диалоговое окно, похожее на подтверждение javascript, но с кнопкой asp.net со своим клик-событием.

3 измените свой

return confirm(\"This image name already exists, do you want to replace it?\"); 

в RegisterClientScriptBlock вашего первого события с логикой диалога jquery.

4- В новом событии вашей новой кнопки добавьте дополнительную логику:

if (something else)
{
    // you´ll know the user click your confirm button already!!!
}

Надеюсь, это поможет вам.

Ответ 5

FishBasketGordo благодарит за то, что указал на разницу! Была большая помощь!

Page.ClientScript.RegisterClientScriptBlock не срабатывал, пока я не сделал указанное вами изменение, т.е. удалил теги и добавил "true" в качестве четвертого параметра. Может быть хорошей идеей проверить, что никакой другой блок script не меняет изменения, которые не срабатывает, а также что блок script имеет уникальное имя.

Ответ 6

У меня была такая же проблема сегодня утром, и она работала именно так:

Response.Write("<script type='text/javascript'>alert('" + AlerteMsg + "');</script>");

в вашем случае вы можете написать любой javascript, который вам нужен!

Ответ 7

У меня была такая же проблема сегодня утром, и она работала именно так:

Response.Write( "alert ('" + AlerteMsg + "');" );

в вашем случае вы можете написать любой javascript, который вам нужен!

из кода выше. Теперь мне нужно нажать 2 раза назад кнопку.. затем он вернется.. любое решение