Как вызвать диалог пользовательского интерфейса jQuery из кода ASP.NET без события на стороне клиента?

Я пытаюсь открыть диалоговое окно пользовательского интерфейса jQuery из моего кода C# ASP.NET на основе значения, находящегося за пределами определенного диапазона, а не на основе нажатия кнопки или другого события на стороне клиента. Вот функция Javascript, которая должна создать диалоговое окно (вверху страницы .aspx):

<script type="text/javascript">
  //Total out of range dialog
  function ShowRangeDialog() {
    $('#rangeDialog').dialog({
      modal: true,
      width: 'auto',
      resizable: false,
      draggable: false,
      close: function (event, ui) {
        $('body').find('#rangeDialog').remove();
      },
      buttons:
      {
        'OK': function () {
          $(this).dialog('close');
        }
      }
    });
  }
</script>

Вот сам блок диалога (внизу страницы .aspx):

<div id="rangeDialog" style="display: none;" title="Total out of range">
  <p>
    Your line items total is out of the range allowed by the approval level you chose.
    Please check the approval range and adjust the line items or quantities.
  </p>
</div>

А вот часть кода C#, которая пытается отобразить диалоговое окно:

if (currTotal < lowerLim || currTotal > upperLim)
{
  //Show jQuery dialog telling user that their line items total is out of range
  Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "dlgOutOfRange",
    "ShowRangeDialog();", true);
}

Код в блоке if достигается и выполняется, если я прохожу его в отладчике, но диалоговое окно не отображается. Что мне не хватает?


person timbck2    schedule 04.06.2013    source источник
comment
Я обнаружил опечатку в своем диалоговом сценарии — перед селектором rangeDialog отсутствовал символ «#», поэтому он никак не мог сработать, потому что не мог найти мой диалоговый элемент div. Однако это ничего не изменило, он по-прежнему не работает.   -  person timbck2    schedule 04.06.2013


Ответы (2)


Я немного изменил свою функцию на основе вопроса/ответа, который я нашел по адресу Как мне открыть диалоговое окно пользовательского интерфейса jQuery из моего кода C#?, и теперь это работает. Вот измененная функция:

<script type="text/javascript">
  //Total out of range dialog
  function ShowRangeDialog() {
    $(function() {
      $('#rangeDialog').dialog({
        modal: true,
        width: 'auto',
        resizable: false,
        draggable: false,
        close: function (event, ui) { $('body').find('#rangeDialog').remove(); },
        buttons: { 'OK': function () { $(this).dialog('close'); }
        }
      })
    }).dialog("open");
  }
</script>
person timbck2    schedule 04.06.2013

попробуй это

if (currTotal < lowerLim || currTotal > upperLim)
{
  //Show jQuery dialog telling user that their line items total is out of range
  Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "dlgOutOfRange",
    "ShowRangeDialog();", true);
}

Вы должны просто вызывать имя функции.

Кроме того, вы можете попробовать startupscript вместо registerclientscriptblock. Вы должны быть уверены, что ваш скрипт будет добавлен ПОСЛЕ определения функции, а не раньше.

if (currTotal < lowerLim || currTotal > upperLim)
{
  //Show jQuery dialog telling user that their line items total is out of range
  Page.ClientScript.RegisterStartupScript(this.GetType(), "dlgOutOfRange",
    "ShowRangeDialog();", true);
}
person Smeegs    schedule 04.06.2013
comment
Разве это не то же самое, что и у меня, когда я просто сказал ASP.NET отображать теги ‹script› вместо того, чтобы делать это самостоятельно? Я все равно попробовал это сделать как с RegisterClientScriptBlock, так и с RegisterStartupScript, но это не имело никакого значения. - person timbck2; 04.06.2013
comment
Вы проверили, где рендерится javascript в сгенерированном источнике? Как я уже упоминал, он должен отображаться после определения функции. - person Smeegs; 04.06.2013
comment
Есть несколько причин, по которым он не срабатывает. Большие 2: 1) он вызывается слишком рано и 2) в функции есть синтаксическая ошибка. Чтобы проверить № 2, я бы просто вызвал функцию для $(document)ready(function(){ShowRangeDialog();}); Если он не срабатывает, когда вы вызываете его при готовности документа, значит, в реальной функции что-то не так. Не вызов функции - person Smeegs; 04.06.2013
comment
Я посмотрел на сгенерированный исходный код, и он определенно вставляется после моей функции. И когда я помещаю его в $(document).ready(function(){}), диалоговое окно появляется сразу. Так что я не знаю, что еще попробовать отсюда. - person timbck2; 05.06.2013
comment
Да, это странно. Попробуйте сделать простое предупреждение и посмотрите, сработает ли это. - person Smeegs; 05.06.2013