[散分] 终于搞定了! 动态加载切换Ajax模式!! , 动态添加ScriptManager,UpdatePanel

mjk2008 mjk2008 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
之前我发过一贴. 结果没有人理..
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之前, 就把控件掉包了 , 哈哈!!!


好了. 不说太多了. 这贴只给看得懂的人看.

...全文

相关推荐

评论 98
收藏 已收藏
分享
返回顶部
mjk2008
.NET社区 62,271 成员 668,968 内容