高技术! 动态加载切换Ajax模式!! , 动态添加ScriptManager,UpdatePanel

本文介绍了一种在ASP.NET页面中实现在传统模式与AJAX模式间切换的方法。通过修改web.config文件并利用ScriptManager和UpdatePanel组件,在不同模式下更新页面内容而无需完全刷新。


事情是这样的. 公司要我做AJAX的应用. 希望能切换传统模式和AJAX模式.
就好像这个网页 http://ajaxuploader.com/Demo/multiple-files-upload.aspx 最下面的切换按钮一样.


起初我也不知道如何实现. 后来该着该着, 终于让我试出来了. 现在和大家分享一下 :


web.config:
-------- -------- -------- -------- -------- -------- -------- --------

<?xml version="1.0"?>
<configuration>
  <system.web>
<customErrors mode="Off" />
<compilation debug="true"/>
<httpHandlers>
  <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
</httpHandlers>
  </system.web>
</configuration>


Test.master
-------- -------- -------- -------- -------- -------- -------- --------

<%@ Master Language="C#" AutoEventWireup="true" %>

<script runat="server">

public string AjaxMode
{
get
{
//we can get the mode by another way. for example : cookie.
string mode = Request.QueryString["AjaxMode"];
if (mode == null)
return "Atlas";
return mode;
}
}

protected override void AddParsedSubObject(object obj)
{
HtmlForm form = obj as HtmlForm;
if (form != null)
{
if (AjaxMode == "Atlas")
{
System.Web.UI.ScriptManager manager = new ScriptManager();
ManagerHolder.Controls.Add(manager);
System.Web.UI.UpdatePanel updatepanel = new UpdatePanel();
ContentPanel.Controls.Add(updatepanel);
MyTemplate template = new MyTemplate();
template.holder = ContentPlaceHolder1;
ContentPanel.Controls.Remove(ContentPlaceHolder1);
updatepanel.ContentTemplate = template;
}
}

base.AddParsedSubObject(obj);
}
class MyTemplate : ITemplate
{
public ContentPlaceHolder holder;
public void InstantiateIn(Control container)
{
container.Controls.Add(holder);
}
}
</script>

<!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">
<head runat="server">
<title>Master Page </title>
</head>
<body>
<form id="form1" runat="server">
<asp:PlaceHolder ID="ManagerHolder" runat="server" />
<h1>
Mode :
<%=AjaxMode %>
</h1>
<asp:Panel ID="ContentPanel" runat="server">
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</asp:Panel>
<hr />
<a href="Default.aspx?AjaxMode=NoAjax">NoAjax </a> <a href="Default.aspx?AjaxMode=Atlas">
Atlas </a>
</form>
</body>
</html>


Default.aspx
-------- -------- -------- -------- -------- -------- -------- --------

<%@ Page Language="C#" MasterPageFile="~/Test.master" Title="Default Page" %>

<script runat="server">

protected void Button1_Click(object sender, EventArgs e)
{
Button1.Text = "You Clicked Me";
}
</script>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
<asp:Button ID="Button1" runat="server" Text="ClickMe" OnClick="Button1_Click" />
</asp:Content>


-------- -------- -------- -------- -------- -------- -------- --------

我在这里解说一下. 一开始我是在OnInit里动态添加的.
但是发现有各种各样的问题.  关键就是OnInit的时候, Default.aspx里的内容已经加进去了.
那个时候移动控件 , 会触发 OnUnload 事件.

后来得到同事的指点 , 在 AddParsedSubObject 里做!!!

这样就能在所有控件的OnInit之前, 就把控件掉包了 , 哈哈!!!


好了. 不说太多了. 这贴只给看得懂的人看.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值