Как c # codebehind может запускать код JavaScript?

#c# #javascript

#c# #javascript

Вопрос:

У меня есть некоторый JavaScript-код, который отобразит модальное диалоговое окно с просьбой к пользователю подождать, пока он запустит веб-службу, запуск которой может занять несколько секунд. Чего не могу понять, так это как запустить JS-код из моего C #-кода, запущенного на сервере. Вот сценарий:

1) Пользователь нажимает asp: код кнопки, который запускает серверный код. 2) Серверный код [каким-то образом] запускает событие браузера, которое запускает JS-код, вызывающий веб-службу

Код JS выглядит следующим образом:

 <form id="form1" runat="server">
<div>
    <script type="text/javascript">
        $(function () {
            $('#btn_BeginProcessB').click(function (event) {
                event.preventDefault();
                var $Seconds = $("INPUT[id*='txtSeconds']").val();
                var $Message = $("INPUT[id*='txtMessage']").val();
                var $WorkingMessage = $('#WorkingMessage');
                $WorkingMessage.text($Message);

                var $this = $(this);
                var $Loader = $('#Loader');
                // show loading indicator              
                $Loader.show();
                $("body").css({ background: "#C8C5C5" });
                // Begin process
                $.ajax({
                    type: 'POST',
                    dataType: "json",
                    contentType: "application/json; charset=utf-8",
                    data: JSON.stringify({ Seconds: $Seconds }),
                    url: 'SimpleWebService.asmx/LongRunningProcess',
                    error: function (xhr, textStatus, errorThrown) {
                        alert('Error! '   errorThrown);
                        // show button
                        // hide loading indicator                
                        $Loader.hide();
                    },
                    success: function (data) {
                        alert("Data:"   data.d);
                        // show button
                        // hide loading indicator                
                        $Loader.hide();
                        $("body").css({ background: "#FFFFFF" });
                    }
                });

            });
        });
    </script>
    <script type="text/javascript">
        function LoadPageWorking() {
            var $Seconds = $("INPUT[id*='txtSeconds']").val();
            var $Message = $("INPUT[id*='txtMessage']").val();
            var $WorkingMessage = $('#WorkingMessage');
            $WorkingMessage.text($Message);
            var $data = JSON.stringify({ Seconds: $Seconds });
            PageWorking('Loader', 'SimpleWebService.asmx/LongRunningProcess', $data, PageWorkingSuccess, PageWorkingError);  
        };

        function PageWorkingSuccess(data) {
            $("SPAN[id*='lblResult']").html("<br /><b>Result:</b>"   data.d   "<br />");
            $('body').css('background', originalBackground);
        };

        function PageWorkingError(xhr, textStatus, errorThrown) {
            alert('Error! '   errorThrown);
            $('body').css('background', originalBackground);
        }
    </script>
    <!--- HTML --->
    <div id="Page">
        <h1>
            Long Running Process Test Page</h1>
        <p>
            This site demonstrates how to invoke a long running process and let the user know
            that the process is underway. When the button is clicked, it calls a web service
            that sleeps for the designated number of seconds and returns a message.</p>
        <br />
        Enter number of seconds for worker process to sleep:
        <asp:TextBox ID="txtSeconds" runat="server" Width="25" Text="3" /><br />
        Enter the message to be displayed while the process is working:
        <asp:TextBox ID="txtMessage" runat="server" Text="Working...(please be patient)"
            Width="300px" /><br />
        <asp:Label ID="lblResult" runat="server" />
        <br />
        <input type="button" id="btnBegin" value="Click to test LoadPageWorking function"
            onclick="LoadPageWorking();" />
    </div>
    <div id="Loader">
        <center>
        <span id="WorkingMessage">Default Loader Message</span>
            <div class="ProgressBar-Animated">
                amp;nbsp;</div>
        </center>
    </div>
</div>
</form>
  

Какой код я могу написать в своем событии C #, которое запустит функцию LoadPageWorking () JS?

Комментарии:

1. Почему бы событию click кнопки не запустить функцию LoadPageWorking.

Ответ №1:

Даже если у вас есть кнопка управления на стороне сервера, вы можете использовать это onclientclick свойство для прямого вызова javascript. Но если вам нужно вызвать скрипт из исходного кода, вы можете использовать ClientScriptManager.RegisterStartupScript() or ClientScriptManager.RegisterClientScriptBlock() в зависимости от ваших требований. Существует множество примеров.

Ответ №2:

Пусть кнопка запускает функцию работы со страницей, которая создает некоторый индикатор того, что вы работаете, запускает ajax-запрос, а когда он возвращается, завершает работу и скрывает индикатор. Никогда не нужно переходить к коду позади.

Ответ №3:

Почему бы вам не LoadPageWorking() запустить сервер, а затем показать модальное всплывающее окно JS? Вы можете заставить всплывающее окно опросить ваш сервис, чтобы определить, завершено ли оно, и скрыть себя, когда это произойдет.

Ответ №4:

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