Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从asp.net中的代码隐藏调用jquery函数不会';好像不行_C#_Asp.net_Jquery_Updatepanel_Code Behind - Fatal编程技术网

C# 从asp.net中的代码隐藏调用jquery函数不会';好像不行

C# 从asp.net中的代码隐藏调用jquery函数不会';好像不行,c#,asp.net,jquery,updatepanel,code-behind,C#,Asp.net,Jquery,Updatepanel,Code Behind,在将记录插入数据库后,我正在调用jquery函数 ScriptManager.RegisterClientScriptBlock(LbOk, typeof(LinkButton), "json", "topBar('Successfully Inserted');", true); 我已经把它包含在我的母版页中,以便在回发后执行jquery函数 <script type="text/javascript"> func

在将记录插入数据库后,我正在调用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();">

函数加载(){
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
}
函数EndRequestHandler()
{
顶栏(信息);
}
功能顶栏(消息){
警报(a);
变量警报=$(''+消息+'');
$(document.body).append(警报);
var$alert=$(“#alert”);
如果($alert.length){
var alerttimer=window.setTimeout(函数(){
$alert.trigger('click');
}, 5000);
$alert.animate({height:$alert.css('line-height')| |'50px'},200)。单击(函数(){
clearTimeout(alerttimer);
$alert.animate({height:'0'},200);
});
}
}

但它似乎不起作用。。。任何建议..

假设您的代码隐藏在UpdatePanel刷新期间运行,EndRequest处理程序和代码隐藏注册之间是否存在不良交互?topBar()应该被调用两次,一次是使用“成功插入”消息,另一次是使用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);
}
功能顶栏(消息){
变量$alert=$('');
$alert.text(消息);
$alert。单击(函数(){
美元(本).slideUp(200);
});
$(正文)。追加($alert);
//如果已经滑动,重新滑动不会造成任何伤害
//隐藏,这使这个简单。
setTimeout(函数(){$alert.slideUp(200)},5000);
}
这并不能解决EndRequest和Register*脚本都执行topBar()的问题,但这应该可以避免它们之间的冲突,这样您就可以更好地看到发生了什么


尝试一下,让我们知道这是否会改变情况。

对于Chrome和Firefox,我遇到的唯一问题是
var-alert
alert()调用同名

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

下面是一个完整的工作示例:

<%@ 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>

受保护的void b更新\u单击(对象发送方,事件参数e)
{
//单击按钮时,调用topBar功能
//注意HtmlEncode以确保正确转义字符串
ScriptManager.RegisterStartupScript(
这
GetType(),
“钥匙”,
字符串格式(
“顶栏({0});”,
Server.HtmlEncode(“已成功插入”)
), 
真的
);
}    
功能顶栏(消息){
变量警报=$(''+消息+'');
$(document.body).append(警报);
var$alert=$(“#alert”);
如果($alert.length){
var alerttimer=window.setTimeout(函数(){
$alert.trigger('click');
}, 5000);
$alert.animate({height:$alert.css('line-height')| |'50px'},200)。单击(函数(){
clearTimeout(alerttimer);
$alert.animate({height:'0'},200);
});
}
}

这并没有直接回答您的问题,而是更倾向于传递另一种技术来调用页面方法,而不使用更新面板,而是直接从jQuery调用

只需像这样装饰您的页面方法(在codebehind的部分类中)(它必须是静态的):

然后,您可以直接从jQuery的$.ajax方法调用此页面方法:

$("#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");
      }
    }
  });

});
注册脚本非常简单,而且比注册脚本要简单得多。也不需要创建web服务

这是一篇很棒的文章:


是调用了警报(a)还是什么都没有?@Dave alert出现了,但下面的语句没有执行,请尝试使用不同的变量名来表示“alert”和“$alert”。我不确定,但我会小心重新定义本机警报函数。至少这不是一个好的编码实践。@dave t:你说得对,这不是一个好的实践。但这不应该是他的问题,因为他将
警报定义为局部变量。window.alert()不会被重新定义。如果在
alert(a)
之前包含
alert($)
会发生什么?当它不工作时会发生什么?什么都没有?您是否确定在异步回发过程中没有JavaScript错误或服务器端错误(这会阻止Register*脚本发出其负载)?如果您使用Firebug在topBar()函数中设置断点,那么在该函数无法正常工作时是否输入了该函数?已确认工作正常。我的代码调用UnFreezeScreen()
ScriptManager.RegisterStartupScript(BTN_Submit,BTN_Submit.GetType(),“key”,“UnFreezeScreen();”,True)
感谢您的解决方案,但如果我知道如何使其与多个操作一起工作,并使用从代码隐藏发送的消息案例?如果您有时间,请更新或提供一个小示例。谢谢
[WebMethod]
[ScriptMethod(ResponseFormat=ResponseFormat.Json, XmlSerializeString=true)]
public static bool UpdateDatabase(string param1 , string param2)
{
    // perform the database logic here...

    return true;
}
$("#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");
      }
    }
  });

});