[散分] 终于搞定了! 动态加载切换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之前, 就把控件掉包了 , 哈哈!!!


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

...全文
809 98 打赏 收藏 转发到动态 举报
写回复
用AI写文章
98 条回复
切换为时间正序
请发表友善的回复…
发表回复
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可以 顶你屁眼一个
加载更多回复(78)
内容概要:本文提出了一种考虑构网型储能支撑能力的微电网优化调度策略,通过Matlab代码实现,旨在提升微电网在复杂运行环境下的稳定性与经济性。研究聚焦于构网型储能系统(如虚拟同步发电机VSG)的动态特性及其对微电网频率、电压等关键参数的主动支撑能力,构建了包含光伏、储能、负荷等多元组件的微电网系统模型。采用优化算法(如改进灰狼算法、模型预测控制等)对系统进行日前或实时调度,优化目标涵盖运行成本最小化、可再生能源消纳最大化、储能寿命延长以及系统可靠性提升等多个方面。文中详细阐述了模型构建、算法设计与仿真验证全过程,并通过案例分析证明了所提策略在平抑功率波动、提高能源利用效率和增强系统韧性方面的有效性。; 适合人群:具备电力系统、自动化或相关专业背景,熟悉Matlab/Simulink仿真工具,从事微电网、分布式能源、储能控制等领域研究的研发人员和研究生;尤其适合有一定科研基础、希望深入理解构网型控制与优化调度结合应用的1-3年工作经验的研究者。; 使用场景及目标:① 掌握构网型储能(Grid-Forming Energy Storage)在微电网中的建模方法与控制原理;② 学习如何将储能的主动支撑能力融入优化调度框架,实现源-储-荷协同调控;③ 借助Matlab代码实现完整的微电网优化调度仿真流程,用于科研论文复现、课题开发或工程方案预研。; 阅读建议:此资源以实际Matlab代码为核心,理论与实践紧密结合,建议读者在理解基本电力系统知识的基础上,结合文档中的模型结构与算法逻辑,逐步调试并运行代码,深入掌握每一步的实现细节。同时可参考文中提及的智能优化算法与控制策略,拓展至其他类似电力系统优化问题的研究中。
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 UG(Unigraphics)是一种功能完备的计算机辅助设计与制造(CAD/CAM)软件,在机械工程、汽车制造、航空航天等多个行业得到普遍使用。FANUC作为全球领先的数控系统生产商,其数控机床在精密加工领域中得到了广泛部署。"UG FANUC经典后处理"是指为FANUC数控系统专门设计的UG软件后处理技术,它是CAM编程过程中的关键组成部分。 后处理是UG CAM系统的一个构成部分,其核心功能是将由UG生成的刀具路径数据转换为特定数控系统的机器指令,这些指令能够被FANUC数控机床所识别并执行。FANUC18M可能代表FANUC的一个特定型号或版本的控制系统,该系统拥有M代码功能,用于控制机床的多种动作。 UG的后处理流程包括对刀具路径的改进、速度与进给率的确定、换刀指令的制定以及切削参数的配置等环节。用户可以根据自己机床的特性与加工需求来设计后处理器,目的是确保生成的代码既高效又安全,同时满足工件精度要求。 "UG FANUC经典后处理"可能集成了一套预设的、适用于FANUC系统的工作参数和代码格式,帮助用户在编程时能够迅速且精确地为FANUC机床生成G代码。这一特性显著简化了编程步骤,减少了错误发生的概率,对于不太熟悉后处理技术的用户而言,是一个极具价值的工具。 在实际操作中,用户可能需要依据工件的材料、形态、大小以及加工方法来调整后处理参数,比如切削速度、进给率、刀具选择等。FANUC18M后处理器通常会提供一系列预设配置,用户可以根据具体情况进行选择和细致调整,以获得最优的加工表现。 除了基础的G代码生成,UG的后处理还可能包含其他高级特性,例如模拟验证。借助UG的...

62,271

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧