前兩天研究了一下Flex與.NET如何進(jìn)行數據交互,并寫(xiě)了一個(gè)文檔,后面敘述得還不是很詳細,還可以再研究深一點(diǎn)。本文是關(guān)于Flex與 ASP.NET通過(guò)Remoting方式進(jìn)行通訊的內容,過(guò)段時(shí)間有空還會(huì )把其它的通訊方式也描述一下,順便也會(huì )把Flex3與FluorineFx數據 類(lèi)型轉換這方面的內容講一下,都是通過(guò)在網(wǎng)上找資料和自己研究所總結出來(lái)的,應該說(shuō)講得還是很淺,畢竟學(xué)得還不深,繼續努力學(xué)習!
一、軟件:
1、Flex平臺:Adobe Flex Builder 3
2、.Net平臺:Visual Studio .Net 2008
3、Remoting網(wǎng)關(guān):Fluorine
4、第三方組件:RemoteObjectAMF0
二、介紹:
1、Fluorine是一種開(kāi)源的AMF(ActionScript Messaging Formatter)網(wǎng)關(guān),專(zhuān)門(mén)負責Flex3.0與.Net交互時(shí)的數據類(lèi)型轉換。Fluorine現支持ActionScript 2.0和ActionScript 3.0,所以Fluorine也可作為Flash與.Net交互時(shí)的AMF網(wǎng)關(guān)。
2、RemoteObjectAMF0組件是一種基于MXML的第三方組件,用于連接AMF網(wǎng)關(guān)。
3、好處:
(1)交互時(shí)數據類(lèi)型的自動(dòng)轉換。因為Flex與.NET的數據類(lèi)型是不同的,例如Flex的Date與.NET中的DateTime類(lèi)型。這樣就導致Flex與.NET進(jìn)行數據交互過(guò)程中必須進(jìn)行數據類(lèi)型的轉換。這種數據類(lèi)型的轉換我們可以自己通過(guò)編寫(xiě)相關(guān)的代碼來(lái)實(shí)現,例如在Flex及.NET中編寫(xiě)一個(gè)實(shí)體類(lèi)對其取得的數據進(jìn)行類(lèi)型轉換。而利用Fluorine這種網(wǎng)關(guān)來(lái)實(shí)現數據交互的話(huà),它能夠實(shí)現.NET與Flex中的數據類(lèi)型的自動(dòng)對應轉換,這樣從一定程度上就減輕了我們對其數據類(lèi)型處理的煩惱。
(2)交互效率的提高:利用網(wǎng)關(guān)進(jìn)行數據交互的話(huà),它使得Flex能夠直接與.Net的數據處理類(lèi)進(jìn)行通信,而不必像再通過(guò)另一層中間數據交互層來(lái)實(shí)現,從一定程度上它的交互效率會(huì )提高很多。
(3)這是一個(gè)開(kāi)源的網(wǎng)關(guān)。
三、基本配置
1、服務(wù)器端的搭建:
(1)安裝FluorineFx,安裝完后在目錄中會(huì )有“Source”及“Samples”兩個(gè)文件夾,“Samples”文件夾中包含了一些在VS.Net環(huán)境中使用Fluorine的例子?!?/span>Source”文件夾中包含了有關(guān)Fluorine的源代碼。(代碼未具體去研究)
(2)安裝好Fluorine之后,系統自動(dòng)在VS.Net 2008新建網(wǎng)站中增加一個(gè)模板:FluorineFx ASP.NET Web Application。選擇該模板,創(chuàng )建一個(gè).NET網(wǎng)站。
圖3.1
a)打開(kāi)Visual Studio 2008,分別選擇 文件 -> 新建 -> 網(wǎng)站
b)選擇已安裝模板“FluorineFx ASP.NET Web Application”。
c)運行項目,獲取.NET自帶服務(wù)器生成的端口,及網(wǎng)址,本項目中是 http://localhost:4166/FluorineTest/
(3)利用VS的模板進(jìn)行創(chuàng )建后,系統會(huì )自動(dòng)加載一些引用,以及創(chuàng )建相關(guān)文件,并進(jìn)行簡(jiǎn)單配置。創(chuàng )建完后的項目結構如圖所示:
圖3.2
“Bin”中的Dll就是用Fluorine的源文件所生成的程序集,“Templates”是一些模板?!?/span>WEB-INF/flex”中包含了XML都是些配置文件?!?/span>Gateway.aspx”是個(gè)空頁(yè)面,其網(wǎng)頁(yè)地址就是Fluorine的網(wǎng)關(guān)地址。
2、客戶(hù)端的配置:
客戶(hù)端的配置有三種方法,一種是通過(guò)向導來(lái)設置參數,從而創(chuàng )建Flex;另一種是通過(guò)指定services-config.xml配置文件來(lái)設置;第三種是利用第三方組件RemoteObjectAMF0來(lái)連接,這種方式就不用再去配置services-config.xml。(推薦用第三種方法)
(1)向導設置方法:
步驟1. 新建Flex工程。選擇ColdFusion Flash Remoting。如圖3.3:
步驟2. 配置服務(wù)器。Deployed to J2EE server。如圖3.4:
(2)services-config.xml配置文件來(lái)設置
修改工程的屬性,如圖3.5:
修改“Additional compiler arguments”,設置services-config.xml配置文件的路徑,可以指向剛才建立的VS.Net項目中的“WEB-INF/flex”中的services-config.xml路徑。也可以將services-config.xml這個(gè)文件拷貝到調用文件的同級目錄中,然后如上面所設。
(3)利用第三方組件RemoteObjectAMF0來(lái)連接,這種方法講到時(shí)再進(jìn)行介紹。
四、通信過(guò)程
1、在VS.Net中編寫(xiě)數據處理類(lèi)HelloWorld.cs文件(可以新建一個(gè)FluorineFx ServiceLibrary類(lèi)庫文件,將所有的數據處理類(lèi)放到庫中上,然后在網(wǎng)站中調用此類(lèi)庫,這里就不創(chuàng )建了)。HelloWorld.cs文件的代碼如下所示:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using FluorineFx;
namespace FluorineHelloWorld
{
/// <summary>
///HelloWorld 的摘要說(shuō)明
/// </summary>
[RemotingService()]
public class HelloWorld
{
public HelloWorld()
{
//
//TODO: 在此處添加構造函數邏輯
//
}
public string FromFluorine(string userName)
{
return "您好," + userName + "!此消息來(lái)自Fluorine Flash Remoting";
}
}
}
RemotingService屬性并不是必需的,不過(guò)使用該屬性,在配置了服務(wù)瀏覽器的Web應用上可以通過(guò)Console.aspx查看遠程服務(wù)類(lèi)文件,以及調用該服務(wù)的ActionScrip。例如可以在上頁(yè)類(lèi)文件中設置斷點(diǎn),然后將Console.aspx設置為起始頁(yè),啟動(dòng)項目。頁(yè)面會(huì )跳轉到Fluorine.aspx頁(yè)面,當調用FromFluorine()函數時(shí),就會(huì )中斷。下圖是對函數所進(jìn)行的調用結果。
圖4.1
2、配置Flex工程中的services-config.xml。主要是設置這個(gè)endpoint屬性。讓其指向之前得到的網(wǎng)關(guān)地址,另外就是設置了“destination”。
<?xml version="1.0" encoding="UTF-8"?>
<services-config>
<services>
<service id="remoting-service"
class="flex.messaging.services.RemotingService"
messageTypes="flex.messaging.messages.RemotingMessage">
<destination id="fluorine">
<channels>
<channel ref="my-amf"/>
</channels>
<properties>
<source>*</source>
</properties>
</destination>
</service>
</services>
<channels>
<channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
<endpoint uri="http://localhost:4166/FluorineTest/Gateway.aspx"
class="flex.messaging.endpoints.AMFEndpoint"/>
</channel-definition>
</channels>
</services-config>3、如下創(chuàng )建一個(gè)MXML文件。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
public function clickBtnHelloWorld():void{
sampleRemoteObject.FromFluorine(this.txtHelloWorld.text);
}
public function RemoteResult(re:ResultEvent):void
{
var str:String = re.result as String;
Alert.show(str);
}
public function RemoteFault(re:FaultEvent):void
{Alert.show("Message:" + re.fault.faultString,"出錯");}
]]>
</mx:Script>
<!--這里Source 對應.NET類(lèi),前面是命名空間,后面是類(lèi)名 source = 命名空間.類(lèi)名-->
<mx:RemoteObject
id="sampleRemoteObject"
destination="fluorine"
source="FluorineHelloWorld.HelloWorld"
showBusyCursor="true">
<!--這里是.NET中的方法,name = 方法名 -->
<mx:method name="FromFluorine" result="RemoteResult(event)" fault="RemoteFault(event)"/>
</mx:RemoteObject>
<mx:Panel horizontalAlign="center" verticalAlign="middle" width="250" height="200" layout="absolute">
<mx:TextInput x="35" y="10" id="txtHelloWorld" />
<mx:Button x="82.5" y="40" label="調用" id="btnHelloWorld" click="clickBtnHelloWorld()"/>
</mx:Panel>
</mx:Application>
這里創(chuàng )建了一個(gè)RemoteObject對象,并設置了其id屬性,“destination”指向services-config.xml中的“destination”的id,source對應VS.Net類(lèi),前面FluorineHelloWorld是命名空間,后面HelloWorld是類(lèi)名?!?/span>showBusyCursor”是指在交互時(shí)鼠標的狀態(tài)是否為設置為繁忙。
RemoteObject中創(chuàng )建了一個(gè)method方法,“name”屬性跟所要調用的VS.Net類(lèi)中的函數名相同,“result”設置返回結果后的處理事件,“fault”設置交互過(guò)程中出錯后的處理事件 。
4、運行Flex,結果如下:
圖4.2
圖4.3
五、使用RemoteObjectAMF0來(lái)連接fluorine網(wǎng)關(guān)
1、上面連接網(wǎng)關(guān)是利用了Flex自帶的RemoteObject組件來(lái)實(shí)現,利用這個(gè)組件來(lái)實(shí)現的話(huà),需要在創(chuàng )建項目時(shí)對項目進(jìn)行配置,或者利用配置文檔進(jìn)行配置,這些在上面已經(jīng)做了詳細的介紹?,F在介紹的是利用RemoteObjectAMF0組件來(lái)實(shí)現。這個(gè)組件是一種基于MXML的第三方組件,用于連接AMF網(wǎng)關(guān),同時(shí)它是一個(gè)開(kāi)源的組件。
2、下載RemoteObjectAMF0后解壓,在“src”文件夾中就可以看到關(guān)于該組件的源代碼,它基本上是對flex中的RemoteObject組件進(jìn)行的重寫(xiě)??梢詫ⅰ?/span>src”文件夾中的“com”文件夾全部拷貝到flex的工程中,也可以將其編譯成庫文件再引用到Flex工程中。
3、這時(shí)將“com”文件夾拷貝到了工程中。要使用該組件,默認情況下,要在MXML文件中的“Applications”標簽中加入命名空間“xmlns:renaun="com.renaun.rpc.*"”。
4、RomoteObjectAMF0組件的定義語(yǔ)法如下所示:
<renaun:RemoteObjectAMF0 endpoint="http://localhost:4166/FluorineTest/Gateway.aspx" id="sampleRemoteObject" source="FluorineHelloWorld.HelloWorld" showBusyCursor="true">
<renaun:methods>
<renaun:method name="FromFluorine" result="RemoteResult(event)" fault="RemoteFault(event)"/>
</renaun:methods>
</renaun:RemoteObjectAMF0>
RemoteObjectAMF0組件的“endpoint”屬性指明AMF網(wǎng)關(guān)地址,“source”屬性指明類(lèi)的名稱(chēng)空間,<名稱(chēng)空間:method>組件的name屬性指向類(lèi)中的方法,必須與類(lèi)中的定義相同,result事件處理返回的數據。
5、RemoteObjectAMF0的調用方法跟上面講RemoteObject時(shí)差不多,比如都可以通過(guò)sampleRemoteObject.FromFluorine(this.txtHelloWorld.text);去調用.NET中的FromFluorine()方法。
六、復雜數據類(lèi)型的通訊
(http://xingfustar.cnblogs.com/) Remoting支持傳送數組、List、HashTable、Dictionary等多種復雜數據類(lèi)型,本文以數組,Dictionary,HashTable為例,講解復雜數據類(lèi)型的通訊。
(一)數組(http://xingfustar.cnblogs.com/)
1、.NET服務(wù)器端程序
(http://xingfustar.cnblogs.com/)
假設我們要做段程序,來(lái)獲取所有的用戶(hù)姓名。修改上節中的代碼,增加一個(gè)GetUsers方法。代碼如下:
public string[] GetArray()
{
string[] array = new string[]{"張三","李四","王五"};
return array;
}
2、Flex客戶(hù)端程序(http://xingfustar.cnblogs.com/)
在 Design 模式下添加,添加一個(gè) Text文本控件,id為txtUsers,txt屬性為空,添加一個(gè) Button控件,id為btnGetArray,Label屬性為 GetArray
在 Source 模式下, 修改 mx:RemoteObject 標簽,添加
<mx:method name="GetArray" result="RemoteResult(event)" fault="RemoteFault(event)"/>
修改腳本中 RemoteResult 方法,增加一個(gè)Case條件,代碼如下
public function RemoteResult(re:ResultEvent):void
{
switch(re.currentTarget.name)
{
case "HelloWord":
var str:String = re.result as String;
this.txtHelloWord.text = str;
break;
case "SayHello":
str = re.result as String;
this.txtSayHello.text = str;
break;
case "GetArray":
for(var i:int=0; i<re.result.length; i++)
{
this.txtUsers.text += re.result[i].toString() + ", ";
}
break;
}
}
在
mx:Button (GetArray) 標簽中添加屬性
click="sampleRemoteObject.GetArray()"
運行Flex程序,在瀏覽器中查看效果
(二)Dictionary
(http://xingfustar.cnblogs.com/)1、.NET服務(wù)器端程序
(http://xingfustar.cnblogs.com/)
接下來(lái)我們做個(gè)Dictionary的例子,假設上例中,我們不光要獲取用戶(hù)姓名,而且我們還要得到他對應的年齡,我們使用Dictionary。修改代碼,添加如下方法:
public Dictionary<String, Int32> GetDictionary()
{
Dictionary<String, Int32> age = new Dictionary<string, int>();
age.Add("張三", 23);
age.Add("李四", 24);
age.Add("王五", 22);
return age;
}
2、Flex客戶(hù)端程序(http://xingfustar.cnblogs.com/)
在 Design 模式下添加,添加六個(gè) Text文本控件,屬性分別為 id = txtZhangSan,txt = ""; id = txtLiSi,txt = ""; id = txtWangWu,txt = ""; txt = "張三:"; txt = "李四:"; txt = "王五:"
添加一個(gè) Button控件,id為btnGetDictionary,Label屬性為 GetDictionary
在 Source 模式下, 修改 mx:RemoteObject 標簽,添加
<mx:method name="GetDictionary" result="RemoteResult(event)" fault="RemoteFault(event)"/>
修改腳本中 RemoteResult 方法,增加一個(gè)Case條件,代碼如下
public function RemoteResult(re:ResultEvent):void
{
switch(re.currentTarget.name)
{
case "HelloWord":
var str:String = re.result as String;
this.txtHelloWord.text = str;
break;
case "SayHello":
str = re.result as String;
this.txtSayHello.text = str;
break;
case "GetUsers":
for(var i:int=0; i<re.result.length; i++)
{
this.txtUsers.text += re.result[i].toString() + ", ";
}
break;
case "GetDictionary":
this.txtZhangSan.text = re.result["張三"];
this.txtLiSi.text = re.result["李四"];
this.txtWangWu.text = re.result["王五"];
break;
}
}
在 mx:Button (GetDictionary) 標簽中添加屬性 click="sampleRemoteObject.GetDictionary()"
運行Flex程序,在瀏覽器中查看效果
(三)HashTable(http://xingfustar.cnblogs.com/)
1、.NET服務(wù)器端程序(http://xingfustar.cnblogs.com/)
我們將上例中的Dictionary類(lèi)型改成HashTable類(lèi)型,代碼如下:
public Hashtable GetHashTable()
{
Hashtable hash = new Hashtable();
hash.Add("張三", 23);
hash.Add("李四", 24);
hash.Add("王五", 22);
return hash;
}
2、Flex客戶(hù)端程序(http://xingfustar.cnblogs.com/)
借用下上例內容,在 Design 模式下添加一個(gè) Button控件,id為btnGetHashTable,Label屬性為 GetHashTable
在 Source 模式下, 修改 mx:RemoteObject 標簽,添加
<mx:method name="GetHashTable" result="RemoteResult(event)" fault="RemoteFault(event)"/>
修改腳本中 RemoteResult 方法,只需在上例 case "GetDictionary": 下一行加上 case "GetHashTable": 即可。
case "GetDictionary":
case "GetHashTable":
this.txtZhangSan.text = re.result["張三"];
this.txtLiSi.text = re.result["李四"];
this.txtWangWu.text = re.result["王五"];
break;
在
mx:Button (GetHashTable) 標簽中添加屬性
click="sampleRemoteObject.GetHashTable()"完整代碼后附
七、自定義實(shí)體對象的傳遞(http://xingfustar.cnblogs.com/)
本節是Remoting通訊的最后一節,主要講述自定義實(shí)體對象的傳遞,并簡(jiǎn)單了解下Flex中類(lèi)的聲明及DataGrid的使用方法。我們仍分兩個(gè)部分來(lái)講。
1、.NET服務(wù)器端程序(http://xingfustar.cnblogs.com/)
首先,我們編寫(xiě)一個(gè)用戶(hù)實(shí)體類(lèi),包括姓名、性別及年齡,類(lèi)代碼如下 /*----------------------------------------------------------------
* 版權:http://XingFuStar.cnblogs.com
*
* 文件名: User.cs
* 文件功能描述: User實(shí)體類(lèi)
*
* 作者:XingFuStar
* 日期:2007年12月11日
*
* 當前版本:V1.0.0
*
* 修改日期:
* 修改內容:
*---------------------------------------------------------------*/
using System;
namespace RemotingSample
{
public class User
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private int age;
public int Age
{
get { return age; }
set { age = value; }
}
private string sex;
public string Sex
{
get { return sex; }
set { sex = value; }
}
public User()
{
}
}
}
在我們前兩節編寫(xiě)的RemotingSample類(lèi)中添加 GetUsers 方法,代碼如下:
public List<User> GetUsers()
{
List<User> users = new List<User>();
User user = new User();
user.Name = "張三";
user.Age = 23;
user.Sex = "男";
users.Add(user);
user = new User();
user.Name = "李四";
user.Age = 24;
user.Sex = "女";
users.Add(user);
user = new User();
user.Name = "王五";
user.Age = 22;
user.Sex = "男";
users.Add(user);
return users;
}
接下來(lái),我們開(kāi)編寫(xiě)Flex端,重點(diǎn)在Flex這里
2、Flex客戶(hù)端程序(http://xingfustar.cnblogs.com/)
在Flex工程中,添加一個(gè) ActionScript Class, 我們先在工程中添加一個(gè) 名為Module的文件夾 。接下來(lái),右鍵點(diǎn)擊這個(gè)文件夾,在其中添加一個(gè) ActionScript Class, 類(lèi)名為“User”(并不一定要與.NET中的類(lèi)相同,這里想同是便于理解和管理)
在新建的類(lèi)中添加如下代碼:
/*----------------------------------------------------------------
* 版權:http://XingFuStar.cnblogs.com
*
* 文件名: User.as
* 文件功能描述: 用戶(hù)實(shí)體類(lèi)
*
* 作者:XingFuStar
* 日期:2007年12月14日
*---------------------------------------------------------------*/
package Module
{
//這名話(huà)是必須的,用這句話(huà)來(lái)綁定.Net中的類(lèi)
[RemoteClass(alias="RemotingSample.User")]
public class User
{
public function User()
{
//請不要刪除以下信息
//版權:http://XingFuStar.cnblogs.com
}
private var name:String;
public function get Name():String
{
return name;
}
public function set Name(setValue:String):void
{
name = setValue;
}
private var age:int;
public function get Age():int
{
return age;
}
public function set Age(setValue:int):void
{
age = setValue;
}
private var sex:String;
public function get Sex():String
{
return sex;
}
public function set Sex(setValue:String):void
{
sex = setValue;
}
}
}
注意這個(gè)類(lèi)的第一行,有這樣一句話(huà) [RemoteClass(alias="RemotingSample.User")] 這是連接.NET類(lèi)的關(guān)鍵所在, 添加這句話(huà)后,這個(gè)類(lèi),才與.NET中創(chuàng )建的User類(lèi)建立了聯(lián)系。
[RemoteClass(alias="命名空間.類(lèi)名")]
在 Design 模式下添加,添加一個(gè) DataGrid,id為dgUser,新添加的DataGrid自動(dòng)生成了三個(gè)DataGridColumn,修改其headerText,和dataField。headerText為DataGrid每行的標題,dataField為綁定的實(shí)體對象的屬性。
DataGrid設計如下代碼所示:
<mx:DataGrid x="38" y="318" height="116" width="312" id="dgUser">
<mx:columns>
<mx:DataGridColumn headerText="姓名" dataField="Name"/>
<mx:DataGridColumn headerText="性別" dataField="Sex"/>
<mx:DataGridColumn headerText="年齡" dataField="Age"/>
</mx:columns>
</mx:DataGrid> 繼續添加一個(gè)Button控件,id為btnGetUsers,Label屬性為 GetUsers
在 Source 模式下, 修改 mx:RemoteObject 標簽,添加
<mx:method name="GetUsers" result="RemoteResult(event)" fault="RemoteFault(event)"/>
修改腳本中 RemoteResult 方法,代碼如下
public function RemoteResult(re:ResultEvent):void
{
switch(re.currentTarget.name)
{
case "HelloWord":
var str:String = re.result as String;
this.txtHelloWord.text = str;
break;
case "SayHello":
str = re.result as String;
this.txtSayHello.text = str;
break;
case "GetArray":
for(var i:int=0; i<re.result.length; i++)
{
this.txtUsers.text += re.result[i].toString() + ", ";
}
break;
case "GetDictionary":
case "GetHashTable":
this.txtZhangSan.text = re.result["張三"];
this.txtLiSi.text = re.result["李四"];
this.txtWangWu.text = re.result["王五"];
break;
case "GetUsers": //新加部分
var userList:ArrayCollection = new ArrayCollection();
for(var j:int=0; j<re.result.length; j++)
{
var user:User = re.result[j] as User;
userList.addItem(user);
}
//用來(lái)綁定DataGrid
this.dgUser.dataProvider = userList;
break;
}
}
在 mx:Button (GetUsers) 標簽中添加屬性 click="sampleRemoteObject.GetUsers()"
運行Flex程序,在瀏覽器中查看效果
附件:源碼
1、.Net端
/*----------------------------------------------------------------
* 版權:http://XingFuStar.cnblogs.com
*
* 文件名: RemotingSample
* 文件功能描述: .NET與Flex通訊DEMO
*
* 作者:XingFuStar
* 日期:2007年12月11日
*
* 當前版本:V1.0.0
*
* 修改日期:2007年12月14日
* 修改內容:增加獲取數組,Dictionary,HashTable等方法例程
*---------------------------------------------------------------*/
using System;
using com.TheSilentGroup.Fluorine;
using System.Collections.Generic;
using System.Collections;
namespace RemotingSample
{
[RemotingService("Fluorine sample service")]
public class RemotingSample
{
public RemotingSample()
{
//請不要刪除以下信息
//版權:http://XingFuStar.cnblogs.com
}
public string HelloWord()
{
return "Hello Word!";
}
public string SayHello(string name)
{
return "Hello " + name + "!";
}
public string[] GetArray()
{
string[] array = new string[]{"張三","李四","王五"};
return array;
}
public Dictionary<String, Int32> GetDictionary()
{
Dictionary<String, Int32> dictionary = new Dictionary<string, int>();
dictionary.Add("張三", 23);
dictionary.Add("李四", 24);
dictionary.Add("王五", 22);
return dictionary;
}
public Hashtable GetHashTable()
{
Hashtable hash = new Hashtable();
hash.Add("張三", 23);
hash.Add("李四", 24);
hash.Add("王五", 22);
return hash;
}
public List<User> GetUsers()
{
List<User> users = new List<User>();
User user = new User();
user.Name = "張三";
user.Age = 23;
user.Sex = "男";
users.Add(user);
user = new User();
user.Name = "李四";
user.Age = 24;
user.Sex = "女";
users.Add(user);
user = new User();
user.Name = "王五";
user.Age = 22;
user.Sex = "男";
users.Add(user);
return users;
}
}
}
2、Flex端
<?xml version="1.0" encoding="utf-8"?>
<!--
* 版權:http://XingFuStar.cnblogs.com
*
* 作者:XingFuStar
* 日期:2007年12月11日
*
* 修改日期:2007年12月14日
* 修改內容:增加獲取數組,Dictionary,HashTable等方法例程。
-->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
import Module.User;
public function RemoteResult(re:ResultEvent):void
{
switch(re.currentTarget.name)
{
case "HelloWord":
var str:String = re.result as String;
this.txtHelloWord.text = str;
break;
case "SayHello":
str = re.result as String;
this.txtSayHello.text = str;
break;
case "GetArray":
for(var i:int=0; i<re.result.length; i++)
{
this.txtUsers.text += re.result[i].toString() + ", ";
}
break;
case "GetDictionary":
case "GetHashTable":
this.txtZhangSan.text = re.result["張三"];
this.txtLiSi.text = re.result["李四"];
this.txtWangWu.text = re.result["王五"];
break;
case "GetUsers": //新加部分
var userList:ArrayCollection = new ArrayCollection();
for(var j:int=0; j<re.result.length; j++)
{
var user:User = re.result[j] as User;
userList.addItem(user);
}
//用來(lái)綁定DataGrid
this.dgUser.dataProvider = userList;
break;
}
}
public function RemoteFault(re:FaultEvent):void
{
Alert.show("Message:" + re.fault.faultString,"出錯");
}
]]>
</mx:Script>
<!--這里Source 對應.NET類(lèi),前面是命名空間,后面是類(lèi)名 source = 命名空間.類(lèi)名-->
<mx:RemoteObject
id="sampleRemoteObject"
destination="fluorine"
source="RemotingSample.RemotingSample"
showBusyCursor="true">
<!--這里是.NET中的方法,name = 方法名 -->
<mx:method name="HelloWord" result="RemoteResult(event)" fault="RemoteFault(event)"/>
<mx:method name="SayHello" result="RemoteResult(event)" fault="RemoteFault(event)"/>
<mx:method name="GetArray" result="RemoteResult(event)" fault="RemoteFault(event)"/>
<mx:method name="GetDictionary" result="RemoteResult(event)" fault="RemoteFault(event)"/>
<mx:method name="GetHashTable" result="RemoteResult(event)" fault="RemoteFault(event)"/>
<mx:method name="GetUsers" result="RemoteResult(event)" fault="RemoteFault(event)"/>
</mx:RemoteObject>
<mx:Text x="38" y="25" id="txtHelloWord"/>
<mx:Button x="38" y="51" label="HelloWord" id="btnHelloWord0" click="sampleRemoteObject.HelloWord()"/>
<mx:Text x="38" y="105" id="txtSayHello"/>
<mx:Label x="38" y="131" text="name:"/>
<mx:TextInput x="88" y="129" id="txtName"/>
<mx:Button x="256" y="129" label="SayHello" id="btnSayHello" click="sampleRemoteObject.SayHello(this.txtName.text)"/>
<mx:Text x="38" y="181" id="txtUsers"/>
<mx:Button x="38" y="207" label="GetArray" id="btnGetArray" click="sampleRemoteObject.GetArray()"/>
<mx:Label x="38" y="262" text="張三:"/>
<mx:Text x="76" y="262" id="txtZhangSan"/>
<mx:Label x="129" y="262" text="李四:"/>
<mx:Text x="167" y="262" id="txtLiSi"/>
<mx:Label x="218" y="262" text="王五:"/>
<mx:Text x="256" y="262" id="txtWangWu"/>
<mx:Button x="38" y="288" label="GetDictionary" id="btnGetDictionary" click="sampleRemoteObject.GetDictionary()"/>
<mx:Button x="157" y="288" label="GetHashTable" id="btnGetHashTable" click="sampleRemoteObject.GetHashTable()"/>
<mx:DataGrid x="38" y="318" height="116" width="312" id="dgUser">
<mx:columns>
<mx:DataGridColumn headerText="姓名" dataField="Name"/>
<mx:DataGridColumn headerText="性別" dataField="Sex"/>
<mx:DataGridColumn headerText="年齡" dataField="Age"/>
</mx:columns>
</mx:DataGrid>
<mx:Button x="38" y="453" label="GetUsers" id="btnGetUsers" click="sampleRemoteObject.GetUsers()"/>
</mx:Application>
至此,Flex 與 Asp.Net 通過(guò) Remoting 方式進(jìn)行通訊 的全部文章都已完成,前后經(jīng)歷了一個(gè)星期的時(shí)間,有很多地方寫(xiě)的還不完善,希望看過(guò)的朋友們批評指教!還是希望喜歡本文的朋友們,轉載請注明出處!
版權由http://xingfustar.cnblogs.com/所有,轉載請注明出處