.NET

Flex与FluorineFx传值

   最近学习了一下Flex + FluorineFx,其中遇到了一个问题,就是FluorineFx与Flex之间怎样传值,为了这个问题在网上找了不少资料,然后有自己试了一下,下面把我的成果分享一下。

(1)传类对象,我这里没成功,不知为啥,但是网上有很多成功示例。

(2)传DataSet ,网上说加上这句话 [DataTableType( "ServiceLibrary.Book")]就行,但是我试过之后

不可以,也有说加上[DataSetType("ServiceLibrary.Book")]的,但是我试过之后在.Net端就没数据了,更别提

          Flex端了。

(3)传DataTable,成功了,关键是加上 [DataTableType( "ServiceLibrary.Book")]。

(4)传XmlDocument,成功了。

(5)传String,成功了,其实String保存的也是XML形式,跟XmlDocument差不多。

(6)传 List<>,成功了,网上也有很多人都用这种方式。

 

FluorineFx端的Service

 

namespace ServiceLibrary
{
    /// <summary>
    /// Fluorine sample service.
    /// </summary>
    [RemotingService("Fluorine sample service")]
    public class Sample
    {
        public Sample()
        {
        }

        public string Echo(string text)
        {
            return "Gateway echo: " + text;
        }
        /// <summary>
        /// 还有问题
        /// </summary>
        /// <returns></returns>
        public Book GetBook()
        {
            return new Book
            {
                ID = 2,
                Name = "让子弹飞一会",
                Author = "姜文",
                Price = 32
            };
        }
        /// <summary>
        /// 还有问题,不能传值
        /// </summary>
        /// <returns></returns>
        [DataTableType("Books", "ServiceLibrary.Book")]
        public DataSet GetDataSet()
        {
            DataSet ds = new DataSet("DS");
            DataTable dt = ds.Tables.Add("Books");
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("Author", typeof(string));
            dt.Columns.Add("Price", typeof(double));

            DataRow dr = dt.NewRow();
            dr["ID"] = 1;
            dr["Name"] = "《Flex游戏开发》";
            dr["Author"] = "张三";
            dr["Price"] = 54.85;
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr["ID"] = 2;
            dr["Name"] = "《Flash游戏开发》";
            dr["Author"] = "李四";
            dr["Price"] = 65.50;
            dt.Rows.Add(dr);

            return ds;
        }
        public XmlDocument GetXML()
        {
            DataSet ds = new DataSet("DS");
            DataTable dt = ds.Tables.Add("Books");
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("Author", typeof(string));
            dt.Columns.Add("Price", typeof(double));

            DataRow dr = dt.NewRow();
            dr["ID"] = 1;
            dr["Name"] = "《Flex游戏开发》";
            dr["Author"] = "张三";
            dr["Price"] = 54.85;
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr["ID"] = 2;
            dr["Name"] = "《Flash游戏开发》";
            dr["Author"] = "李四";
            dr["Price"] = 65.50;
            dt.Rows.Add(dr);

            String xmlStr = "<?xml version=\"1.0\" encoding=\"utf-8\"?> \n";
            xmlStr += ds.GetXml();
            XmlDocument xml = new XmlDocument();
            xml.LoadXml(xmlStr);
            return xml;
        }
        public String GetStringXML()
        {
            DataSet ds = new DataSet("DS");
            DataTable dt = ds.Tables.Add("Books");
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("Author", typeof(string));
            dt.Columns.Add("Price", typeof(double));

            DataRow dr = dt.NewRow();
            dr["ID"] = 1;
            dr["Name"] = "《Flex游戏开发》";
            dr["Author"] = "张三";
            dr["Price"] = 54.85;
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr["ID"] = 2;
            dr["Name"] = "《Flash游戏开发》";
            dr["Author"] = "李四";
            dr["Price"] = 65.50;
            dt.Rows.Add(dr);

            String xmlStr = "<?xml version=\"1.0\" encoding=\"utf-8\"?> \n";
            xmlStr += ds.GetXml();
            return xmlStr;
        }
        [DataTableType("ServiceLibrary.Book")]
        public DataTable GetDataTable()
        {
            DataTable dt = new DataTable("Books");
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("Author", typeof(string));
            dt.Columns.Add("Price", typeof(double));

            DataRow dr = dt.NewRow();
            dr["ID"] = 1;
            dr["Name"] = "《Flex游戏开发》";
            dr["Author"] = "张三";
            dr["Price"] = 54.85;
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr["ID"] = 2;
            dr["Name"] = "《Flash游戏开发》";
            dr["Author"] = "李四";
            dr["Price"] = 65.50;
            dt.Rows.Add(dr);

            return dt;
        }
        public List<Book> GetList()
        {
            List<Book> list = new List<Book>();
            Book book = new Book();
            book.ID = 1;
            book.Name = "《Flex游戏开发》";
            book.Author = "张三";
            book.Price = 50;
            list.Add(book);

            book = new Book();
            book.ID = 1;
            book.Name = "《Flash游戏开发》";
            book.Author = "李四";
            book.Price = 60;
            list.Add(book);
            return list;
        }
    }
    public class Book
    {
        public Book() { }
        public int ID { get; set; }
        public string Name { get; set; }
        public string Author { get; set; }
        public double Price { get; set; }
    }

 Flex调用代码

 

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
	<mx:Script>
		<![CDATA[
			import mx.collections.ArrayCollection;
            import mx.controls.Alert;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
            import mx.rpc.xml.SimpleXMLDecoder;
            import mx.utils.ObjectUtil;
            import mx.utils.ArrayUtil;
            [Bindable]
            private var book:BookVO;
            [Bindable]
            private var books:ArrayCollection = null;
            private function resultEcho(event:ResultEvent):void
            {
                // 测试成功!已经获得数据。
                trace("event.result:" + event.result);
                Alert.show(event.result as String, "Result");
            }

            private function faultOperation(event:FaultEvent):void
            {
                // 如果测试失败!显示无法获得数据。
                trace("event.message:" + event.message);
                Alert.show("无法获得数据!", "错误"); 
            }
            // 没实现,返回的对象为空
            private function onGetBook(event:ResultEvent):void
            {
            	book = event.result as BookVO;
            	Alert.show(event.result.ID as String, "Result");
            } 
            // 成功 关键是加上 [DataTableType("Flex.CustomerVO")]
            // 要在 WebService加上 [DataTableType("Flex.CustomerVO")]
            private function onGetDataTable(event:ResultEvent):void
            {
            	//---------WebService解析方法---------
            	//books = event.result.Tables.Books.Rows as ArrayCollection;
            	//bookGrid.dataProvider=this.service.GetDataTable.lastResult.Tables.Books.Rows;
            	//---------WebService解析方法---------
            	books = event.result as ArrayCollection;
            	bookGrid.dataProvider= books;   	
            }
            // 没实现,返回的对象为空
            // 在 WebService加上 [DataTableType("Flex.CustomerVO")] 在webservice成功,在这不好使
            // 在 WebService加上 [DataSetType("Flex.CustomerVO")] 在webservice 和 在 这都不好使
            private function onGetDataSet(event:ResultEvent):void
            {   //---------WebService解析方法---------
            	//books = this.service.GetDataSet.lastResult.diffgram.DS.Books as ArrayCollection;
                //books = event.result.Books.serverInfo.initialData as ArrayCollection;
                //---------WebService解析方法---------
                books = event.result as ArrayCollection;
                bookGrid.dataProvider= books;  
            }
            // 成功!!!!!!!!!!!!!!
            private function onGetList(event:ResultEvent):void      
            {
            	books = service.GetList.lastResult as ArrayCollection;
            	bookGrid.dataProvider= books;
            }
            // 成功!!!!!!!!!!!!!!
            // Webservice端是  XmlDocument 这种格式
            private function onGetXML(event:ResultEvent):void 
            {
            	var xmltree:XML = new XML();
            	xmltree = event.result as XML;
                books = new ArrayCollection();
                 books.removeAll();
                 for each(var xml:XML in xmltree.children())
         	     {
         		     books.addItem(xml);
         	     } 
                 bookGrid.dataProvider= books; //把数据源绑定到列表中 
            }
            // 希望XMLDocument 转化成 ArrayCollection
            // 没试呢
            private function convertXmlToArrayCollection( file:String ):ArrayCollection
            {
                var xml:XMLDocument = new XMLDocument( file );
                var decoder:SimpleXMLDecoder = new SimpleXMLDecoder();
                var data:Object = decoder.decodeXML( xml );
                var array:Array = ArrayUtil.toArray(data.list.items);
                return new ArrayCollection(array);
            }
            // 成功!!!!!!!!!!!!!!
            // Webservice端是  String 这种格式,但是String存的是 XML
            private function onGetStringXML(event:ResultEvent):void 
            {
            	/* books如果为空的话就会出现不能对空对象进行操作,所以每次使用先 New 一下*/
                 var xmltree:XML = new XML(event.result.toString());
                 books = new ArrayCollection();
                 books.removeAll();
                 for each(var xml:XML in xmltree.children())
         	     {
         		     books.addItem(xml);
         	     } 
                 bookGrid.dataProvider= books; //把数据源绑定到列表中
            }
		]]>
	</mx:Script>
   
   <!--destination必须和WebService中的服务名一样-->
   <!--source是服务所在的class-->
   <mx:RemoteObject id="service" destination="fluorine" source="ServiceLibrary.Sample"
   	fault="faultOperation(event)" >
   	<mx:method name="Echo" result="resultEcho(event)"/>
   	<mx:method name="GetBook" result="onGetBook(event)"/>
   	<mx:method name="GetDataSet" result="onGetDataSet(event)"/>
   	<mx:method name="GetDataTable" result="onGetDataTable(event)"/>
   	<mx:method name="GetList" result="onGetList(event)"/>
   	<mx:method name="GetXML" result="onGetXML(event)"/>
   	<mx:method name="GetStringXML" result="onGetStringXML(event)"/>
   	</mx:RemoteObject>
 
    <mx:VBox paddingLeft="10" paddingRight="10" paddingTop="10" paddingBottom="10" height="162" width="915" >
	    <mx:HBox>
	        <mx:TextInput id="txt" />
	        <mx:Button label="Echo" click="service.Echo(txt.text)" />
	    </mx:HBox>
	    <mx:ControlBar height="116" width="867"> 
         <mx:Button label="DataTable" click="service.GetDataTable()"/> 
         <mx:Button label="Book" click="service.GetBook()"/>
         <mx:Button label="List" click="service.GetList()"/>
         <mx:Button label="XML" click="service.GetXML()"/>
         <mx:Button label="StringXML" click="service.GetStringXML()"/>
         <mx:Button label="DataSet" click="service.GetDataSet()"/> 
         <mx:TextInput width="302" text="{book.Name+book.Author+book.Price}"/>
        </mx:ControlBar> 
    </mx:VBox>
    <mx:DataGrid x="10" y="170" width="543" height="147" id="bookGrid" > 
     <mx:columns> 
             <mx:DataGridColumn headerText="编号" dataField="ID"/> 
             <mx:DataGridColumn headerText="书名" dataField="Name"/> 
             <mx:DataGridColumn headerText="作者" dataField="Author"/> 
             <mx:DataGridColumn headerText="价格" dataField="Price"/> 
    </mx:columns> 
 </mx:DataGrid>
</mx:Application>

你可能感兴趣的:(游戏,.net,xml,webservice,Flex)