[散分] 终于搞定了! 动态加载切换Ajax模式!! , 动态添加ScriptManager,UpdatePanel
之前我发过一贴. 结果没有人理..
http://topic.csdn.net/u/20080924/18/b3816efa-4a8c-4570-b476-df28d3e52ab8.html
CSDN的人才太缺乏了.
--
事情是这样的. 公司要我做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之前, 就把控件掉包了 , 哈哈!!!
好了. 不说太多了. 这贴只给看得懂的人看.