Вызывание функции jQuery из кода позади в asp.net, кажется, не работает

Я вызываю функцию jQuery после вставки записи на базу данных...

ScriptManager.RegisterClientScriptBlock(LbOk, typeof(LinkButton), "json",
                             "topBar('Successfully Inserted');", true);

Я включал это в свою основную страницу для выполнения функции jQuery после обратной передачи,

<script type="text/javascript">
    function load() {
 Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
      }
    function EndRequestHandler()
       {
           topBar(message);
     }


 function topBar(message) {
    alert(a);
    var alert = $('<div id="alert">' + message + '</div>');
    $(document.body).append(alert);
    var $alert = $('#alert');
    if ($alert.length) {
        var alerttimer = window.setTimeout(function() {
            $alert.trigger('click');
        }, 5000);
        $alert.animate({ height: $alert.css('line-height') || '50px' }, 200).click(function() {
            window.clearTimeout(alerttimer);
            $alert.animate({ height: '0' }, 200);
        });
    }
}
    </script>

<body onload="load();">

Но это, кажется, не работает... Любое предложение..

10
задан bala3569 2 July 2010 в 09:22
поделиться

4 ответа

Предполагая, что ваш код программной части выполняется во время обновления UpdatePanel, могло ли быть плохое взаимодействие между обработчиком EndRequest и регистрацией кода программной части? topBar () должен вызываться дважды: один раз с вашим сообщением «Successfully Inserted», а затем один раз с неопределенным параметром в EndRequest (если переменная сообщения не определена где-то, чего мы здесь не видим).

Также имейте в виду, что $ ('# alert') может возвращать более одного элемента. Если topBar () вызывается более одного раза, вероятно, это так.

Как насчет того, чтобы сделать что-то вроде этого, для начала, чтобы смягчить этот непреднамеренный побочный эффект:

function topBar(message) {
  var $alert = $('<div/>');

  $alert.text(message);

  $alert.click(function () {
    $(this).slideUp(200);
  });

  $(body).append($alert);

  // Doesn't hurt anything to re-slideUp it if it's already
  //  hidden, and that keeps this simple.
  setTimeout(function () { $alert.slideUp(200) }, 5000);
}

Это не решает проблему EndRequest и Register * Script, выполняющих topBar (), но это должно предотвратить их конфликт, поэтому вы можете лучше видеть, что происходит.

Попробуйте и дайте нам знать, если это что-то изменит.

3
ответ дан 3 December 2019 в 23:48
поделиться

Вот полный рабочий пример:

<%@ Page Title="Home Page" Language="C#" AutoEventWireup="true" %>
<script type="text/C#" runat="server">
    protected void BtnUpdate_Click(object sender, EventArgs e)
    {
        // when the button is clicked invoke the topBar function
        // Notice the HtmlEncode to make sure you are properly escaping strings
        ScriptManager.RegisterStartupScript(
            this, 
            GetType(), 
            "key", 
            string.Format(
                "topBar({0});", 
                Server.HtmlEncode("Successfully Inserted")
            ), 
            true
        );
    }    
</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <title></title>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
    <script type="text/javascript">
        function topBar(message) {
            var alert = $('<div id="alert">' + message + '</div>');
            $(document.body).append(alert);
            var $alert = $('#alert');
            if ($alert.length) {
                var alerttimer = window.setTimeout(function () {
                    $alert.trigger('click');
                }, 5000);
                $alert.animate({ height: $alert.css('line-height') || '50px' }, 200).click(function () {
                    window.clearTimeout(alerttimer);
                    $alert.animate({ height: '0' }, 200);
                });
            }
        }
    </script>
</head>
<body>
    <form id="Form1" runat="server">

    <asp:ScriptManager ID="scm" runat="server" />

    <asp:UpdatePanel ID="up" runat="server">
        <ContentTemplate>
            <!-- 
                 You could have some other server side controls 
                 that get updated here 
            -->
        </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger 
                ControlID="BtnUpdate" 
                EventName="Click" 
            />
        </Triggers>
    </asp:UpdatePanel>

    <asp:LinkButton 
        ID="BtnUpdate" 
        runat="server" 
        Text="Update" 
        OnClick="BtnUpdate_Click" 
    />

    </form>
</body>
</html>
4
ответ дан 3 December 2019 в 23:48
поделиться

В Chrome и Firefox единственной проблемой, с которой я столкнулся, было то, что var alert имеет то же имя, что и вызов alert().

    function topBar(message) {
        alert(message);
        var alertDiv = $('<div id="alert">' + message + '</div>');
        $(document.body).append(alertDiv);
        var $alert = $('#alert');

Возможно, что тег body не загружен во время выполнения скрипта, что означает, что ссылка $(document.body) будет пустой - и jquery молча не сможет добавить div с alert. В любом случае, никогда не помешает обернуть ваши вызовы в событие $(document).ready:

    ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "json",
                         "$(document).ready(function() { topBar('Successfully Inserted');});", true);
3
ответ дан 3 December 2019 в 23:48
поделиться

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

Просто украсьте ваш метод страницы (в частичном классе codebehind) следующим образом (он должен быть статическим):

[WebMethod]
[ScriptMethod(ResponseFormat=ResponseFormat.Json, XmlSerializeString=true)]
public static bool UpdateDatabase(string param1 , string param2)
{
    // perform the database logic here...

    return true;
}

Затем вы можете вызвать этот метод страницы прямо из метода $.ajax jQuery:

$("#somebutton").click(function() {

  $.ajax({
    type: "POST",
    url: "PageName.aspx/UpdateDatabase",
    data: "{ param1: 'somevalue', param2: 'somevalue' }",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data) {
      if (data.d) {
        topBar("success!");
      } else {
        topBar("fail");
      }
    }
  });

});

Это очень просто, и намного чище, чем пытаться регистрировать скрипты. Также нет необходимости создавать веб-службу.

Это отличная статья:

http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/

3
ответ дан 3 December 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: