flash菜单与asp.net进行交互.

   最近想做一个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 node
nameElement = loginXml.createElement("USERNAME"); // 注释3
nameNode = loginXml.createTextNode("name"); // 注释4
nameNode.nodeValue = _root.username; // 注释5
nameElement.appendChild(nameNode); // 注释6
// pwd node
pwdElement = loginXml.createElement("PWD"); // 注释7
pwdNode = loginXml.createTextNode("pwd");
pwdNode.nodeValue = _root.pwd;
pwdElement.appendChild(pwdNode);
loginElement.appendChild(nameElement); // 注释8
loginElement.appendChild(pwdElement); // 注释9


loginXml.appendChild(loginElement); // 注释10

xmlRepley = new XML(); // 注释11


xmlRepley.onLoad = onLoginReply; // 注释12
function onLoginReply (success) {
if (success) { // 注释13

if (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;
            }
        }
    }

如果有什么不足的地方请指正。

posted @ 2007-09-18 09:14  DotNet菜园  阅读(1619)  评论(1编辑  收藏  举报