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

mjk2008 2008-09-25 11:25:54
之前我发过一贴. 结果没有人理..
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之前, 就把控件掉包了 , 哈哈!!!


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

...全文
737 98 点赞 打赏 收藏 举报
写回复
98 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
leocai82 2009-12-20
收藏
  • 打赏
  • 举报
回复
y63964632 2008-11-20
收藏
  • 打赏
  • 举报
回复
lfywy 2008-11-17
这叫散分?楼主真窝鹾!
  • 打赏
  • 举报
回复
qaz123456qaz 2008-10-21
学习一下
希望再接再厉
多多做贡献!!!
  • 打赏
  • 举报
回复
zhushouqqq 2008-09-27
一人一份 没了。
  • 打赏
  • 举报
回复
ws_hgo 2008-09-26
jf
看下
  • 打赏
  • 举报
回复
大个啊 2008-09-26
UP
  • 打赏
  • 举报
回复
不是简单地换两个页面最外边的控件 --> 不是简单地换masterpage页面最外边的那两个控件
  • 打赏
  • 举报
回复
[Quote=引用 75 楼 mjk2008 的回复:]
我们公司用到的所有控件都很特别. 就是本身可以同时兼容 有和没有 ATLAS 的2种情况.

所以我们开发的时候, 保留了用户的特殊选项 []是否使用AJAX模式.

而且我们做的系统要支持太多的浏览器. 很多浏览器在AJAX模式下工作有很多兼容性问题.

对于那些浏览器, 就必须强制关闭AJAX模式.

这就是动态切换AJAX的原因.
[/Quote]

我们看到的asp.net控件,几乎都是“兼容有或者没有asp.net ajax”两种情况的——实际上根本无需考虑兼容,因为updatepanel是这些控件的合理的容器,而根本无需这控件去依赖于它。

我的意思上面刚刚写了,内容中使用updatepanel是非常局部的,而且尽可能缩小重新加载html的范围,才能有减小屏幕闪烁。如果整个页面所有显示控件最外边放一个updatepanel,那么我怀疑你们的页面现在是不是都过于简单了,以至整个页面在一个updatepanel里边不断重新加载html还看不出屏幕闪烁。

如果把updatepanel的用法用对了,就明白我的意思了。我不是说你们公司的控件是否特别,我是说updatepanel本身的用法应该正常地细分到内容显示布局中去,因此当你切换ajax模式的时候不是简单地换两个页面最外边的控件。
  • 打赏
  • 举报
回复
syc958 2008-09-26
很多浏览器在AJAX模式下工作有很多兼容性问题.

对于那些浏览器, 就必须强制关闭AJAX模式. ????????终于又学到了一招!原来问题是这么解决的!.........佩服ing!
  • 打赏
  • 举报
回复
一旦你使用masterpage,你可以动态装载它。例如在Page内写:
    protected override void OnPreInit(EventArgs e)
{
string m = this.Request.QueryString["m"];
if (m == string.Empty || m == "1")
this.MasterPageFile = "MasterPage.master";
else
this.MasterPageFile = "MasterPage2.master";
base.OnPreInit(e);
}


当然,如果你不喜欢页面Response.Redirect的时候在url上出现m参数,可以使用Session[...]。

而masterpage可以嵌套,也就是说一个masterpage中可以在顶部声明另一个masterpage,因此你可以仅仅把masterpage中涉及ajax控件的部分放在最外边的masterpage里,里边的才是内容。



但是,其实不应该用updatepanel来包括“整页”,把updatepanel作为整个页面所有显示控件的一个容器有点太过火。不知道在需求提出的时候为什么没有讨论到。所给出的gmail的那个参考页面并不是这个使用一个updatepanel整页html刷新的意思。
  • 打赏
  • 举报
回复
全是套路 2008-09-26
學習
  • 打赏
  • 举报
回复
mjk2008 2008-09-26
我们公司用到的所有控件都很特别. 就是本身可以同时兼容 有和没有 ATLAS 的2种情况.

所以我们开发的时候, 保留了用户的特殊选项 []是否使用AJAX模式.

而且我们做的系统要支持太多的浏览器. 很多浏览器在AJAX模式下工作有很多兼容性问题.

对于那些浏览器, 就必须强制关闭AJAX模式.

这就是动态切换AJAX的原因.

  • 打赏
  • 举报
回复
fellowcheng 2008-09-26
看下
  • 打赏
  • 举报
回复
不太明白这个“切换Ajax模式”的含义在哪里体现。

从你的程序中看,你的<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server" />部分也并没有针对不同的ajax开发,那么页面的显示内容的编程跟这个切换的依赖关系并没有体现,这个切换是为了什么呢?

你给出一个页面内容编程依赖于用户客户端选择的ajax模式的编程例子才好说明问题。目前来看,不明白这样做的真实的影响范围(最终用户关心的具体范围)。

我想你们这个任务的需求描述不准确,可能会浪费不少开发时间。
  • 打赏
  • 举报
回复
小C小D 2008-09-26
up up up up
  • 打赏
  • 举报
回复
lovedean 2008-09-26
唯独接分都积极...
  • 打赏
  • 举报
回复
tonyze 2008-09-26
没用过这控件
  • 打赏
  • 举报
回复
belldandy11 2008-09-26
mark
  • 打赏
  • 举报
回复
wanjianhong 2008-09-26
LZ可以 顶你屁眼一个
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
.NET技术社区
创建于2007-09-28

5.8w+

社区成员

.NET技术交流专区
申请成为版主
帖子事件
创建了帖子
2008-09-25 11:25
社区公告
暂无公告