ScriptManager和ClientScript的区别
ClientScript获取用于管理脚本、注册脚本和向页面添加脚本的ClientScriptManager对象。
ScriptManager.RegisterStartupScript方法和ClientScript.RegisterStartupScript方法的区别。
ScriptManager和ClientScriptManager的命名空间均是System.Web.UI。
ClientScript是ClientScriptManager的对象,ClientScriptManager是类。
ScriptManager是用于管理AJAX脚本库和脚本文件
ClientScriptManager用于管理普通的Script。
ScriptManager适用在特殊的场合,那么我们在控件中如何来进行区分应该使用哪一个呢?其实可以通过寻找控件的parent,判断是否有updatepanel,如果有就用ScriptManager;没有的话当然用ClientScript,避免每次postback操作时控件都要进行资源文件的注册。也就是说 是否兼容ajax的问题,ScriptManager兼容于ajax,在ajax updatepanel中使用ClientScript是无效的。
ScriptManager是什么
ScriptManager 控件管理支持 AJAX 的 ASP.NET 网页的客户端脚本。默认情况下,ScriptManager 控件会向页面注册 Microsoft AJAX Library 的脚本。这将使客户端脚本能够使用类型系统扩展并支持部分页呈现和 Web 服务调用这样的功能。
必须在页上使用 ScriptManager 控件,以启用下列 ASP.NET 的 AJAX 功能:
Microsoft AJAX Library 的客户端脚本功能和要发送到浏览器的任何自定义脚本。有关更多信息,请参见使用 Microsoft AJAX Library 创建自定义客户端脚本。
部分页呈现,允许单独刷新页面上的区域而无需回发。ASP.NET UpdatePanel、UpdateProgress 和 Timer 控件需要 ScriptManager 控件才能支持部分页呈现。
Web 服务的 JavaScript 代理类,允许您使用客户端脚本来访问 Web 服务和 ASP.NET 页中特别标记的方法。它通过将 Web 服务和页方法作为强类型对象公开来达到此目的。
JavaScript 类,用于访问 ASP.NET 身份验证、配置文件和角色应用程序服务。
UpdatePanel 里面放了两个Button,但是还是会全刷页面啊 ASP.NET
atePanel2控件中放一个标签控件lb2和一个按 钮(Button1)。
在按钮的Click事件中和(一)中的一样。
注意:
把两个UpdatePanel控件的UpdateMode属性设为Conditional,要把内部控件ChildrenAsTrigger设为 True。但这样内部UpdatePanel内的控件只引发自身的刷新,不会引发外部的UpdatePanel控件的刷新,不会刷新外部的 UpdatePanel控件,因此我们还需要为外部UpdatePanel控件加入一个触发器,触发源指定为Button1控件的Click事件上。
三、两个嵌套的UpdatePanel控件,外部的UpdatePanel内的控件回发只引发内部控件的更新
在页面上放一个ScriptManager和UpdatePanel控件(UpdatePanel1),在UpdatePanel1中放入一个标签控件 (lb1)、一个按钮(Button1)和另一个UpdatePanel控件(UpdatePanel2),在UpdatePanel2控件中放一个标签控件lb2。
在按钮的Click事件中和(一)中的一样。
注意:
要把两个UpdatePanel控件的UpdateMode设为Conditional,把外部UpdatePanel控件的 ChildrenAsTrigger设为false。这样两个UpdatePanel控件都不会刷新,所以还要为内部的UpdatePanel控件建立触 发器,触发源指向外部UpdatePanel中的的Button1的Click事件上。
四、母版页中使用UpdatePanel控件
如果将ScriptManager控件添加在母版页上的话,那么各内容页面就没必要再添加ScriptManager控件了,只需添加UpdatePanel控件就可以了,因为母版页和内容页面将来生成的是一个页面的实例,而在一个页面上是不允许同时存在两个ScriptManager控件的。
如果ScriptManager控件没有添加在母版页上的话,那只能把ScriptManager控件添加在其中一个内容页面里。不要向每一个内容页面中添加ScriptManager控件。
1、内容页面中的UpdatePanel内的控件引起回发,只更新当前内容页面的内容。
此时按钮分别在各自的UpdatePanel控件内。
将两个内容页面内的两个UpdatePanel控件的UpdateMode设为Conditional,ChildrenAsTrigger设为True。
在按钮的Click事件中和(一)中的一样。
这样就出现各内容页的UpdatePanel内的按钮只对当前内容页起作用。
2、在母版页中的按钮引起回发,更新指定内容页的信息。
此时有两个按钮:ButtonOut在母版页中,ButtonIn在内容页面1中。
当点击ButtonOut时,异步更新两个内容页面的信息。当点击ButtonIn时,异步更新母版面中的UpdatePanel1中的信息。
母版页HTML代码如下:
母版页
3、
内容页面的HTML代码如下:
母版页的CS代码如下:
protected void Page_Load(object sender, EventArgs e)
{
ScriptManager1.RegisterAsyncPostBackControl(this.Button1);
}
protected void Button1_Click(object sender, EventArgs e)
{
Label lbl1 = (Label)this.ContentPlaceHolder1.FindControl("Label1");
lbl1.Text = DateTime.Now.ToString();
Label lbl2 = (Label)this.ContentPlaceHolder2.FindControl("Label2");
lbl2.Text = DateTime.Now.ToString();
}
public string BindTitle
{
get
{
return lbl.Text;
}
set
{
lbl.Text = value;
}
}
Child孩子页面的CS代码如下:
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = Master.BindTitle;
Master.BindTitle = "ContentPage1's Action";
((UpdatePanel)Master.FindControl("UpdatePanel1")).Update(); ;
}
五、用户控件中使用UpdatePanel控件
如果父页面中存在ScriptManager控件,那用户控件的页面中不应再放入ScriptManager控件了,只在用户控件中加入UpdatePanel。
其控件的回发与更新规律与使用方式与母版页一样。
asp.net ajax控件问题
前台代码
后台代码
protected void Button1_Click(object sender, EventArgs e)
{
this.Timer1.Enabled = true;
}
protected void Timer1_Tick(object sender, EventArgs e)
{
this.Label1.Text = DateTime.Now.ToString();
}
效果:点击按钮刷新label的值为当前时间
是用ReportViewer以后。在页面打开报表。没有错误信息,页面什么都不显示,日志记录如下信息,知道了帮我
“ReportViewer”Web 服务器控件包含一个 HTTP 处理程序,该处理程序用来显示报表中嵌入或引用的图像、将报表导出到不同的输出格式、提供用于为报表参数选择日期的日历控件,以及使报表会话处于打开状态。
用于该 HTTP 处理程序的配置设置在应用程序 Web.config 文件的 httpHandlers 元素中指定。当您将“ReportViewer”Web 服务器控件从工具箱中拖动到网页上时,会自动在 Web.config 文件中输入配置设置。
您不能移除或修改该 HTTP 处理程序的配置设置。如果修改或删除 Web.config 中的 设置,则在您查看 .aspx 页时,“ReportViewer”Web 服务器控件将引发以下错误:“ReportViewer Web 服务器控件 HTTP 处理程序尚未在应用程序的 Web.config 文件中注册”。错误消息包括 HTTP 处理程序需要的配置信息,您可将这些设置原样复制到 Web.config 文件中。该字符串将类似于下面的示例(注意,版本信息和 PublicKeyToken 将有所不同):
<add path="Reserved.ReportViewerWebControl.axd" verb="*"
type="Microsoft.Reporting.WebForms.HttpHandler,
Microsoft.ReportViewer.WebForms, Version=8.0.0.0,
Culture=neutral, PublicKeyToken=0000000000000000" validate="false"
/>
HTTP 处理程序属于该控件的一部分;不能将其删除,也不能将其替换为您提供的自定义功能。
类中使用ScriptManager.RegisterStartupScript方法,参数怎么给
///
/// 传入信息弹出来
///
///
///
public static void Alert(System.Web.UI.Page page, string msg)
{
page.ClientScript.RegisterStartupScript(page.GetType(), "msg", "alert('" + msg + "');");
}
///
/// 自定义脚本信息
///
///
///
public static void AlertLocation(System.Web.UI.Page page, string msg)
{
page.ClientScript.RegisterStartupScript(page.GetType(), "msg", "" + msg + "");
}
C# ScriptManager.RegisterStartupScript两次注册JavaScript代码
原因就是因为RegisterStartupScript的第3个参数为空,
这个参数是要注册的启动脚本的键,对于相同的键的多个脚本,程序只执行最后一次,你这里就是2次注册时的键相同了,所以只执行了最后一次,解决方法就是设置这个参数为不同的值,或者用我封装的下面这个函数,那么你只要:
JsStart("show('ok');");
JsStart("show('yes');");
protected virtual void JsStart(string code)
{
int i = 0;
string key = string.Format("myJsStart{0}", i);
// 判断是否已经输出过当前这个脚本,以防覆盖掉以前的脚本
while (ClientScript.IsStartupScriptRegistered(this.GetType(),key))
{
i++;
key = string.Format("myJsStart{0}", i);
}
ClientScript.RegisterStartupScript(this.GetType(), key, code, true);
}