protected void timer1_Tick(object sender, EventArgs e)
{
foreach (RepeaterItem item in rpChat.Items)
{
TextBox txt = item.FindControl("txtChatMessage") as TextBox;
if (txt != null)
{
message[i] = txt.Text;
i--;
}
}
lblStatusChat.Text = "";
RepeaterBind();
string javaScript = "<script language=JavaScript>\n" + "alert('Button1_Click client-side');\n" + "</script>";
Page.ClientScript.RegisterStartupScript(this.GetType(), "myKey", javaScript);
}
Run Code Online (Sandbox Code Playgroud)
timer_click触发和更新面板.并且警报消息不会显示在timer_tick事件上
我有我认为应该是一个相当简单的问题,但对于我的生活,我看不出我的问题.问题与ScriptManager.RegisterStartupScript有关,这是我之前多次使用过的.
我的场景是我有一个插入页面的自定义Web控件.控件(以及一个或两个其他)嵌套在UpdatePanel中.它们被插入到PlaceHolder的页面上:
<asp:UpdatePanel ID="pnlAjax" runat="server">
<ContentTemplate>
<asp:PlaceHolder ID="placeholder" runat="server">
</asp:PlaceHolder>
...
protected override void OnInit(EventArgs e){
placeholder.Controls.Add(Factory.CreateControl());
base.OnInit(e);
}
Run Code Online (Sandbox Code Playgroud)
这是页面上唯一的更新面板.
控件需要运行一些初始的javascript才能正常工作.控制电话:
ScriptManager.RegisterStartupScript(this, GetType(),
Guid.NewGuid().ToString(), script, true);
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
ScriptManager.RegisterStartupScript(Page, Page.GetType(),
Guid.NewGuid().ToString(), script, true);
Run Code Online (Sandbox Code Playgroud)
问题是脚本在首次显示页面时正确运行,但在部分回发后不会重新运行.我尝试过以下方法:
我唯一没有尝试的是使用UpdatePanel本身作为控件和类型,因为我不相信控件应该知道更新面板(并且在任何情况下似乎都没有获得更新的好方法面板?).
任何人都可以看到我在上面做错了什么吗?
谢谢 :)
好吧,回答上面的查询 - 它看起来好像占位符以某种方式混淆了ScriptManager.RegisterStartupScript.
当我将控件拉出占位符并将其直接编码到页面上时,Register脚本正常工作(我也将控件本身用作参数).
ScriptManager.RegisterStartupScript(this, GetType(), Guid.NewGuid().ToString(), script, true);
任何人都可以解释为什么注入控件到PlaceHolder会阻止ScriptManager正确注册脚本?我猜这可能与动态控件的生命周期有关,但如果有一个正确的上述过程,我会欣赏(据我所知).
我正在开发一个WebPart(它将在SharePoint环境中使用,虽然它不使用对象模型)我想要公开AJAX功能.由于环境的性质,直接向页面添加脚本管理器是不是一个选项,因此必须以编程方式添加.我试图将ScriptManager控件添加到我的webpart代码中的页面.
protected override void CreateChildControls()
{
if (ScriptManager.GetCurrent(Page) == null)
{
ScriptManager sMgr = new ScriptManager();
// Ensure the ScriptManager is the first control.
Page.Form.Controls.AddAt(0, sMgr);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,执行此代码时,我收到以下错误消息:
"在DataBind,Init,Load,PreRender或Unload阶段,无法修改控件集合."
是否有另一种方法将ScriptManager从WebPart添加到页面中,或者我是否只需将ScriptManager添加到将使用WebPart的每个页面(或母版页)?
下面,我收到此错误:

我已将问题代码缩小到JQuery Mobile 1.0或更高版本以及Asp.NET ScriptManager.
我向Visual Studio 2012添加了一个新的Web窗体项目,并包含以下代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<link rel="stylesheet" href="http://ajax.aspnetcdn.com/ajax/jquery.mobile/1.2.0/jquery.mobile-1.2.0.min.css" />
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.2.min.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/jquery.mobile/1.2.0/jquery.mobile-1.2.0.min.js"></script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" ScriptMode="Release" runat="server"></asp:ScriptManager>
<div>
</div>
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
代码背后没有代码页面.
半天想知道并试图找到解释,我遇到的一个特定网站建议将ScriptMode ="Release"添加到ScriptManager.
将ScriptMode ="Release"添加到ScriptManager后,我没有收到上述错误.
搜索MSDN,它定义了ScriptMode:获取或设置一个值,该值指定是否呈现客户端脚本库的调试版本或发行版本.
将ScriptMode添加到ScriptManager后没有抛出错误,但为什么?有人可以解释为什么添加ScriptMode会阻止错误出现,而且只是添加ScriptMode,意味着真正的解算器还是创可贴?
这里抛出错误:

谢谢
下面我已经包含了渲染的HTML页面:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
</title><link rel="stylesheet" href="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.css" />
<script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
<script src="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.js"></script>
</head>
<body>
<form method="post" …Run Code Online (Sandbox Code Playgroud) ScriptManager和之间有什么区别ToolkitScriptManager?我发现只有一个令人信服的理由:它ToolkitScriptManager可以提高页面性能.如果是这样,为什么使用ScriptManager?
如何判断方法是否在AJAX回发的上下文中运行(即作为UpdatePanel(异步)回发的结果)?
根据egoldin Page.IsAsync是一个非常常见的混淆,与AJAX完全无关.
正确的方法是使用ScriptManager.GetCurrent(页面).IsInAsyncPostBack.
我过去曾使用这样的代码在我的asp.net网页上成功弹出警报消息.现在它不起作用.我无法弄清楚为什么.
ScriptManager.RegisterStartupScript(this, typeof(Page), UniqueID,
"alert('This pops up')", true);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
asp .net中scriptmanager和scriptmanagerproxy有什么区别?
以下是我创建的网站环境:
现在我想访问Master页面的脚本管理器,在我的代码隐藏(C#)文件中动态创建用户控件.
如何访问放置在母版页上的脚本管理器到我的子页面.
我想从JS调用静态服务器端方法,所以我决定在我的网站上使用ScriptManager控件.所以我有一个母版页,具有这样的结构:
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="TopLevelMasterPage.Master.cs"
Inherits="Likedrive.MasterPages.TopLevelMasterPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:fb="http://ogp.me/ns/fb#">
<head runat="server">
<title></title>
<script type="text/javascript">
function getGiftFileUrl() {
function OnSuccess(response) {
alert(response);
}
function OnError(error) {
alert(error);
}
PageMethods.GetGiftFileUrl("hero", 1024, 768, OnSuccess, OnError);
}
getGiftFileUrl();
</script>
</asp:ContentPlaceHolder>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManagerMain"
runat="server"
EnablePageMethods="true"
ScriptMode="Release"
LoadScriptsBeforeUI="true">
</asp:ScriptManager>
<asp:ContentPlaceHolder ID="MainContent" runat="server">
</asp:ContentPlaceHolder>
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
但是当页面加载时,我有一个JS异常 - 未定义PageMethods.我认为该对象将被隐式创建,所以我可以在我的javascript中使用它.
scriptmanager ×10
asp.net ×9
c# ×3
javascript ×3
updatepanel ×3
ajax ×2
asp.net-ajax ×2
jquery ×1
master-pages ×1
web-parts ×1