
本文共 6512 字,大约阅读时间需要 21 分钟。
最近想做一个flash的菜单与asp.net进行交互. 参考了很多网上的资料,最后有以下心得,写出来记一下。
一、动态加载菜单 菜单的内容如下(menu.xml):<?xml version="1.0" encoding="utf-8"?><navigation> <menu id="2" menutext="编辑角色" menuurl="EditRole.aspx"> </menu><menu id="4" menutext="应用程序分配" menuurl="PrincipalInApp.aspx"> </menu> <menu id="5" menutext="权限管理" menuurl="PrincipalInResource.aspx"></menu></navigation>如果动态加载呢?
1)把以menu.xml文件放到网站的根目录之下,然后在flash的as中写如下的as脚本.
mymenu = new XML();mymenu.load("menu.xml");mymenu.ignoreWhite = true;mymenu.onLoad = findThefild;var passItOn = "";menu_text = "";var menu_array = new Array();var submenu_array = new Array();var menuurl_array = new Array();var submenuurl_array = new Array();var tempArray:Array = new Array(); 这样就可以把菜单加载到flash中,至于如何显示,就自己进行处理了. 二、 给菜单中添加动态参数. 我们很多时间使用的url都是如EditRole.aspx?rolename=role1之类,此时应该如何把"?rolename=role1"动态的传给flash呢. 我试验了很多方法,最后的结果如下. 1) 说一下有了flash之后的asp.net页面的生成顺序.例如我的页面是editrole.aspx在此页面中有一个flash菜单. editrole.aspx-->flash-->与flash通信的页面.2) 如何把动态参数传给flash呢,我使用的是xml让asp.net与flash进行通信.3) 那么动态参数如何得到呢?这就要借用第三个页面,也就是专门用来与flash进行交互的页面.而不能使用所点击的菜单的页面.4) 如上在第一个打开的页面如EditRole.aspx?rolename=role1中把"?rolename=role1"保存到cookie或缓存或seession中, 然后则专门与flash进行通信的页面把"?rolename=role1"编写成xml,然后reponse.wirte(参数xml字符串),传给flash. 代码: 1.editrole.aspx页面中的代码. protected void Page_Load(object sender, EventArgs e) { this.txtUserName.Text = this.UserName; //this.Description.Text = ReponseXML(); if (!IsPostBack) { ShowUserInfo(); this.WirteCookie(); }} public void WirteCookie() { //加密程序提供程序的名称 string symmProvider = "DESCryptoServiceProvider"; //需要加密的xml字符串 string stringToEncrypt = this.ReponseXML(); //加密后的字符串 string encryptedContentsBase64 = Cryptographer.EncryptSymmetric(symmProvider, stringToEncrypt);
//写cookies
Response.Cookies["UserSettings"]["uid"] = encryptedContentsBase64;Response.Cookies["UserSettings"]["ur"] =this.UserRole;
Response.Cookies["UserSettings"].Expires = DateTime.Now.AddHours(1);}
protected string ReponseXML()
{ string param=""; int index=Request.Url.ToString().IndexOf("?"); if (index>0) { param=Request.Url.ToString().Substring(index); } return "<LOGIN><USRENAME name=\"user\" right=\"1\" urlParam=\"" + param + "\">"+param+"</USERNAME></LOGIN>"; }//与flash进行交互的页面. [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class XmlRepley : IHttpHandler {public void ProcessRequest(HttpContext context)
{ context.Response.ContentType = "text/xml"; // context.Response.Write("Hello World");string symmProvider = "DESCryptoServiceProvider";
string stringToEncrypt = this.GetUID(context); string decryptedContentsBase64 = Cryptographer.DecryptSymmetric(symmProvider, stringToEncrypt); context.Response.Write(decryptedContentsBase64); }public string GetUID(HttpContext context)
{ string uid = String.Empty; if (context.Request.Cookies["UserSettings"] != null) {if (context.Request.Cookies["UserSettings"]["uid"] != null)
{ uid =context.Request.Cookies["UserSettings"]["uid"]; }}
return uid;}
public bool IsReusable { get { return false; } } }//flash中as代码 //-----------------------------------------------------------//鼠标点击菜单时//-----------------------------------------------------------function itemEvent(mc:MovieClip,url:String){ mc.btn.onRelease = function() {
loginXml = new XML(); // 注释1
loginElement = loginXml.createElement("LOGIN"); // 注释2// name nodenameElement = loginXml.createElement("USERNAME"); // 注释3nameNode = loginXml.createTextNode("name"); // 注释4nameNode.nodeValue = _root.username; // 注释5nameElement.appendChild(nameNode); // 注释6// pwd nodepwdElement = loginXml.createElement("PWD"); // 注释7pwdNode = loginXml.createTextNode("pwd");pwdNode.nodeValue = _root.pwd;pwdElement.appendChild(pwdNode);loginElement.appendChild(nameElement); // 注释8loginElement.appendChild(pwdElement); // 注释9 loginXml.appendChild(loginElement); // 注释10xmlRepley = new XML(); // 注释11
xmlRepley.onLoad = onLoginReply; // 注释12function onLoginReply (success) { if (success) { // 注释13if (xmlRepley.firstChild.firstChild.attributes.right == "1") { // 注释14
getURL(url+xmlRepley.firstChild.firstChild.attributes.urlParam, "_self");}
else{ getURL(url+"?q=错误", "_self");}}}loginXml.sendAndLoad("XmlRepley.ashx", xmlRepley); // 注释15}
}
三、加载动态菜单项
以上的菜单都是flash去读xml菜单文件,那么如果我们有多个不同类型的菜单,则要做多个不同的flash, 而这几个不财的flash中,如果菜单样式一样,只不过是菜单的内容不一样,那么实际上是去读不同的xml菜单文件. 那么有没有办法去实现有程序去给定一个flash菜单的xml数据源呢? 我试验了很多方法,最后的结果如下. 1)说一下有了flash之后的asp.net页面的生成顺序.例如我的页面是editrole.aspx在此页面中有一个flash菜单. editrole.aspx-->flash-->与flash通信的页面. 2)如何把xml菜单传给flash呢,我使用的是xml让asp.net与flash进行通信. 代码 1)在flash的as中写如下的as脚本,得到xml文件菜单. mymenu = new XML();mymenu.load("SendXmlMenu.ashx");mymenu.ignoreWhite = true;mymenu.onLoad = findThefild;var passItOn = "";menu_text = "";var menu_array = new Array();var submenu_array = new Array();var menuurl_array = new Array();var submenuurl_array = new Array();var tempArray:Array = new Array(); 2)在主角色页面如showRoleMenu.aspx页面中写如下代码 protected void Page_Load(object sender, EventArgs e) { Response.Cookies["UserSettings"]["ur"] = "r"; //新页面要打开的菜单. Response.Cookies["UserSettings"].Expires = DateTime.Now.AddHours(1);}
在主用户页面如showUserMenu.aspx页面中写如下代码 protected void Page_Load(object sender, EventArgs e) { Response.Cookies["UserSettings"]["ur"] = "u"; //新页面要打开的菜单. Response.Cookies["UserSettings"].Expires = DateTime.Now.AddHours(1);}
3)在SendXmlMenu.ashx中写以下代码进行xml菜单的传给flash.[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class SendXmlMenu : IHttpHandler {public void ProcessRequest(HttpContext context)
{ context.Response.ContentType = "text/xml"; context.Response.Write(ReadXmlMenu(context)); } public string ReadXmlMenu(HttpContext context) { string ur = this.GetUserRole(context); System.Xml.XmlDocument xmldoc = new System.Xml.XmlDocument(); string path=context.Request.PhysicalPath.Substring(0,context.Request.PhysicalPath.LastIndexOf("\\")); path = path + "\\menu\\"; switch(ur.ToLower()) { case "u"://这个参数通过cookie得到. xmldoc.Load(path + "usermenu.xml"); return xmldoc.OuterXml; case "r": xmldoc.Load(path + "rolemenu.xml"); return xmldoc.OuterXml; default: return String.Empty;}
}
public string GetUserRole(HttpContext context)
{ string ur = String.Empty; if (context.Request.Cookies["UserSettings"] != null) {if (context.Request.Cookies["UserSettings"]["ur"] != null)
{ ur = context.Request.Cookies["UserSettings"]["ur"]; }}
return ur;}
public bool IsReusable
{ get { return false; } } }如果有什么不足的地方请指正。
发表评论
最新留言
关于作者
