- 決戰(zhàn).NET
- 黃忠成
- 1800字
- 2018-12-27 16:56:02
4.5 ProfileService
ASP.NET AJAX提供了另一個(gè)內(nèi)建的Service——Profile Service,與Authentication Service相同,Profile Service也是與ASP.NET所提供的Profile結(jié)合,允許設(shè)計(jì)師通過(guò)JavaScript來(lái)訪問(wèn)位于Server端的Profile信息。與Authentication Servce結(jié)合后,Profile Service可以讓設(shè)計(jì)師在不刷新網(wǎng)頁(yè)的狀態(tài)下,實(shí)現(xiàn)無(wú)刷新登錄及無(wú)刷新帶出用戶設(shè)定的功能。最常見(jiàn)的應(yīng)用例子就是于門戶網(wǎng)站常見(jiàn)的,在使用者登錄后,在首頁(yè)的某個(gè)區(qū)域顯示該用戶所設(shè)定的友情鏈接功能。那具體該如何做呢?請(qǐng)照著下面步驟,在前例的Authentication網(wǎng)頁(yè)中添加Profile的功能。
1. 在SecureFolder中新增一個(gè)名為ProfileTest.aspx的網(wǎng)頁(yè)。
2. 在頁(yè)面中加入一個(gè)ScriptManager控件。
3. 放入顯示和輸入Profile信息的控件及訪問(wèn)Profile Service的JavaScript程序代碼,如程序4-17所示。
4. 在web.config啟動(dòng)Profile功能,這里有兩個(gè)區(qū)段,一個(gè)啟動(dòng)ASP.NET內(nèi)建的Profile功能,另一個(gè)啟用ASP.NET AJAX所提供的Profile Service,如程序4-18所示。
5. 在Default.aspx網(wǎng)頁(yè)中添加一個(gè)HyperLink控件,NavigateUrl設(shè)為/SecureFolder/Profile-Test.aspx,Text設(shè)為Go Profile Form。
程序4-17
Samples\4\AuthenticationTest\SecureFolder\ProfileTest.aspx <%@ Page Language="C#" AutoEventWireup="true" CodeFile="ProfileTest.aspx.cs" Inherits="ProfileTest" %> <!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>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> <script language=javascript> //Profile成功讀取時(shí)調(diào)用的函數(shù) function OnLoadCompleted(numProperties, userContext, methodName) { $get("txtData").value = Sys.Services.ProfileService.properties.Data; $get("Text2").value = Sys.Services.ProfileService.properties. ComplexData.Data1; $get("Text3").value = Sys.Services.ProfileService.properties. ComplexData.Data2; } //Profile成功儲(chǔ)存時(shí)調(diào)用的函數(shù) function OnSaveCompleted(numProperties, userContext, methodName) { alert("OK"); } //讀取或儲(chǔ)存Profile時(shí),失敗時(shí)調(diào)用的函數(shù) function OnProfileFailed(error_object, userContext, methodName) { alert("Profile service failed with message: " + error_object.get_message()); } //儲(chǔ)存Profile信息 function SaveProfile() { Sys.Services.ProfileService.properties.Data = $get("txtData").value; Sys.Services.ProfileService.properties.ComplexData.Data1 = $get('Text2').value; Sys.Services.ProfileService.properties.ComplexData.Data2 = $get('Text3').value; Sys.Services.ProfileService.save(null,OnSaveCompleted, OnProfileFailed, null); } //讀取Profile信息 function LoadProfile() { Sys.Services.ProfileService.load(null,OnLoadCompleted, OnProfileFailed, null); } //在網(wǎng)頁(yè)載入時(shí)調(diào)用的函數(shù),此處調(diào)用LoadProfile來(lái)讀取使用者的Profile function pageLoad() { LoadProfile(); } </script> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> Data: <input id="txtData" type=text /><br /> ComplexData.Data1: <input id="Text2" type=text /><br /> ComplexData.Data2: <input id="Text3" type=text /> <input id="Button1" type="button" value="Save Profile" honclick= "SaveProfile()" /></div> </form> </body> </html>
程序4-18
Samples\4\AuthenticationTest\web.config <system.web> ............. <!-- 啟動(dòng)ASP.NET的Profile功能--> <profile enabled="true"> <!-- 定義Profile中的屬性 --> <properties> <!-- 單一屬性 --> <add name="Data" type="System.String" defaultValue=""/> <!-- 復(fù)雜屬性 --> <group name="ComplexData"> <add name="Data1" type="System.String"/> <add name="Data2" type="System.String"/> </group> </properties> </profile> <system.web.extensions> <scripting> <webServices> <authenticationService enabled="true"/> <!-- 啟用ASP.NET AJAX的Profile Service, readAccessProperties中可設(shè)定允許Profile Service讀取的Profile屬性, writeAccessProperties則設(shè)定允許寫入的屬性,每個(gè)屬性都必須以;分隔, 當(dāng)有復(fù)雜屬性時(shí),必須以<Group Name>.<Property Name>方式于此指定--> <profileService enabled="true" readAccessProperties="Data,ComplexData.Data1, ComplexData.Data2" writeAccessProperties="Data,ComplexData.Data1, ComplexData.Data2"/> </webServices> </scripting> </system.web.extensions> ...........
在使用者登錄后,便可點(diǎn)擊鏈接瀏覽ProfileTest.aspx網(wǎng)頁(yè),此時(shí)pageLoad函數(shù)會(huì)被調(diào)用,本例子調(diào)用了LoadProfile函數(shù)讀取該使用者的Profile,LoadProfile函數(shù)則是調(diào)用了ASP.NET AJAX所提供的ProfileService對(duì)象的load函數(shù)來(lái)讀取Profile信息。與Authentication Service相同,在調(diào)用load函數(shù)時(shí),必須分別指定當(dāng)讀取成功、讀取失敗時(shí)所調(diào)用的函數(shù),此處是設(shè)定為成功時(shí)調(diào)用OnLoadCompleted函數(shù),失敗時(shí)則調(diào)用OnProfileFailed函數(shù),load函數(shù)的第一個(gè)參數(shù)一個(gè)數(shù)組類型,可讓設(shè)計(jì)師明確指定要讀取的Profile屬性,如該屬性為null,代表著要將web.config中所指定可讀取的Profile屬性讀回。此參數(shù)的設(shè)計(jì)用途很明顯,并不是每個(gè)網(wǎng)頁(yè)都需要全部的Profile信息,明確指定需要讀回的Profile屬性,可提高網(wǎng)頁(yè)的性能,如程序4-19 所示,便是僅讀回ComplexData.Data1 及ComplexData.Data2 的Profile屬性值,而不讀取Data屬性。
程序4-19
Sys.Services.ProfileService.load(["ComplexData.Data1","ComplexData.Data2"], OnLoadCompleted, OnProfileFailed, null);
當(dāng)Profile屬性讀回后,設(shè)計(jì)師便可通過(guò)Sys.Services.ProfileService.properties.<屬性名>來(lái)訪問(wèn)該P(yáng)rofile屬性值。當(dāng)需要儲(chǔ)存Profile屬性時(shí),則必須調(diào)用Sys.Services.ProfileService.save函數(shù),與load函數(shù)相同,第一個(gè)參數(shù)是數(shù)組類型,可明確指定要儲(chǔ)存的Profile屬性名稱,第二及第三個(gè)參數(shù)則是指定儲(chǔ)存成功及失敗所調(diào)用的函數(shù)。讀者們可執(zhí)行此程序,在登錄后點(diǎn)擊Go Profile Form,輸入一些信息,點(diǎn)擊儲(chǔ)存后,將瀏覽器關(guān)閉,再次執(zhí)行并登錄后點(diǎn)擊Go Profile Form,即可看到先前所輸入的信息,如圖4-11所示。

圖4-11
不是說(shuō)要做出友情鏈接的功能嗎?這個(gè)范例未免也太簡(jiǎn)單了吧?呵,要實(shí)現(xiàn)這個(gè)功能也不難,請(qǐng)照著以下步驟做。
1. 在web.config中新增一個(gè)Profile properties來(lái)儲(chǔ)存聯(lián)結(jié),這是一個(gè)StringCollection類型的屬性,別忘了設(shè)定Profile Service的readAccessProperties及writeAccessProperties哦,如程序4-20所示。
2. 修改ProfileTest.aspx,加入可以讓使用者鍵入聯(lián)結(jié)的控件,如程序4-21所示。
程序4-20
Samples\4\AuthenticationTest\web.config <!-- 啟動(dòng)ASP.NET的Profile功能--> <profile enabled="true"> <!-- 定義Profile中的屬性 --> <properties> <!-- 單一屬性 --> <add name="Data" type="System.String" defaultValue=""/> <!-- 復(fù)雜屬性 --> <group name="ComplexData"> <add name="Data1" type="System.String"/> <add name="Data2" type="System.String"/> </group> <add name="Links" type="System.Collections.Specialized. StringCollection" /> </properties> </profile> ............... <system.web.extensions> <scripting> <webServices> <authenticationService enabled="true"/> <!-- 啟用ASP.NET AJAX的Profile Service, readAccessProperties中可設(shè)定允許Profile Service讀取的Profile屬性, writeAccessProperties則設(shè)定允許寫入的屬性,每個(gè)屬性都必須以;分隔, 當(dāng)有復(fù)雜屬性時(shí),必須以<Group Name>.<Property Name>方式于此指定--> <profileService enabled="true" readAccessProperties="Data,ComplexData.Data1,ComplexData. Data2,Links" writeAccessProperties="Data,ComplexData.Data1,ComplexData. Data2,Links"/> </webServices> </scripting> </system.web.extensions>
程序4-21
Samples\4\AuthenticationTest\SecureFolder\ProfileTest.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ProfileTest.aspx.cs"
Inherits="ProfileTest" %>
<!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>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<script language=javascript>
function AddLink()
{
var links = $get("links");
links.options.length = links.length+1;
links.options[links.length-1]=
new Option($get("txtNewLink").value,$get("txtNewUrl").value);
}
function OnLoadCompleted(numProperties, userContext, methodName)
{
$get("txtData").value = Sys.Services.ProfileService.properties.Data;
$get("Text2").value = Sys.Services.ProfileService.properties.
ComplexData.Data1;
$get("Text3").value = Sys.Services.ProfileService.properties.
ComplexData.Data2;
$get("links").options.length = 0;
$get("links").options.length =
Sys.Services.ProfileService.properties.Links.length;
for(var i = 0; i < Sys.Services.ProfileService.properties.Links.
length; i++)
{
var s = Sys.Services.ProfileService.properties.Links[i].split(',');
if(s.length == 2)
$get("links").options[i] = new Option(s[0],s[1]);
else
$get("links").options[i] = new Option(s[0],s[0]);
}
}
function OnSaveCompleted(numProperties, userContext, methodName)
{
alert("OK");
}
function OnProfileFailed(error_object, userContext, methodName)
{
alert("Profile service failed with message: " +
error_object.get_message());
}
function SaveProfile()
{
Sys.Services.ProfileService.properties.Data = $get("txtData").value;
Sys.Services.ProfileService.properties.ComplexData.Data1 =
$get('Text2').value;
Sys.Services.ProfileService.properties.ComplexData.Data2 =
$get('Text3').value;
var links = $get("links");
Sys.Services.ProfileService.properties.Links = new
Array(links.options.length);
for(var i = 0; i < links.options.length; i++)
Sys.Services.ProfileService.properties.Links[i] =
links.options[i].text +","+ links.options[i].value;
Sys.Services.ProfileService.save(null,OnSaveCompleted,
OnProfileFailed, null);
}
function LoadProfile()
{
Sys.Services.ProfileService.load(null,OnLoadCompleted,
OnProfileFailed, null);
}
function pageLoad()
{
LoadProfile();
}
</script>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
Data:
<input id="txtData" type=text /><br />
ComplexData.Data1:
<input id="Text2" type=text /><br />
ComplexData.Data2:
<input id="Text3" type=text />
<br />
<select id=" links" name="links">
<option selected="selected"></option>
</select>
Name
<input id="txtNewLink" type="text" />
Url<input id="txtNewUrl" type="text" />
<input id="btnAdd" type="button" value="Add" onclick=
"AddLink()" /><br />
<input id="Button1" type="button" value="Save Profile" onclick=
"SaveProfile()" />
</div>
</form>
</body>
</html>
執(zhí)行此程序后,就可以在ProfileTest.aspx中新增鏈接,這些鏈接信息會(huì)以<名稱>,<Url>的方式存在Profile的Links屬性中,而Links屬性是一個(gè)字符串?dāng)?shù)組,這代表著用戶可儲(chǔ)存1 個(gè)以上的鏈接信息至Links屬性中,如圖4-12所示。

圖4-12
如果不用Select來(lái)顯示鏈接,而真正地使用超鏈接呢?很簡(jiǎn)單,只要放個(gè)div控件到網(wǎng)頁(yè)中,在更新Select時(shí)也順便更新它就行了,如程序4-22所示。
程序4-22
Samples\4\AuthenticationTest\SecureFolder\ProfileTest.aspx <%@ Page Language="C#" AutoEventWireup="true" CodeFile="ProfileTest.aspx.cs" Inherits="ProfileTest" %> <!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>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> <script language=javascript> function LoadLinksArea() { var linkArea = $get("LinksArea"); var s = "<table>"; for(var i = 0; i < Sys.Services.ProfileService.properties.Links. length; i++) { var linkUrl = Sys.Services.ProfileService.properties .Links[i].split(","); s = s + "<tr><td><a href='http://"+linkUrl[1]+"'>"+linkUrl[0] +"</td></tr>"; } linkArea.innerHTML = s+"</table>"; } function RefreshLinksArea() { var linkArea = $get("LinksArea"); var s = "<table>"; var links = $get("Links"); for(var i = 0; i < links.options.length; i++) { s = s + "<tr><td><a href='http://"+links.options[i].value+"'>"+ links.options[i].text+"</td></tr>"; } linkArea.innerHTML = s+"</table>"; } function AddLink() { var links = $get("Links"); links.options.length = links.length+1; links.options[links.length-1]= new Option($get("txtNewLink").value, $get("txtNewUrl").value); RefreshLinksArea(); } function OnLoadCompleted(numProperties, userContext, methodName) { $get("txtData").value = Sys.Services.ProfileService.properties.Data; $get("Text2").value = Sys.Services.ProfileService.properties.ComplexData.Data1; $get("Text3").value = Sys.Services.ProfileService.properties.ComplexData.Data2; $get("Links").options.length = 0; $get("Links").options.length = Sys.Services.ProfileService.properties.Links.length; for(var i = 0; i < Sys.Services.ProfileService.properties.Links.length; i++) { var s = Sys.Services.ProfileService.properties.Links[i].split(','); if(s.length == 2) $get("Links").options[i] = new Option(s[0],s[1]); else $get("Links").options[i] = new Option(s[0],s[0]); } LoadLinksArea(); } function OnSaveCompleted(numProperties, userContext, methodName) { alert("OK"); } function OnProfileFailed(error_object, userContext, methodName) { alert("Profile service failed with message: " + error_object.get_message()); } function SaveProfile() { Sys.Services.ProfileService.properties.Data = $get("txtData").value; Sys.Services.ProfileService.properties.ComplexData.Data1 = $get('Text2').value; Sys.Services.ProfileService.properties.ComplexData.Data2 = $get('Text3').value; var links = $get("Links"); Sys.Services.ProfileService.properties.Links = new Array(links.options.length); for(var i = 0; i < links.options.length; i++) Sys.Services.ProfileService.properties.Links[i] = links.options[i].text +","+ links.options[i].value; Sys.Services.ProfileService.save(null,OnSaveCompleted, OnProfileFailed, null); } function LoadProfile() { Sys.Services.ProfileService.load(null,OnLoadCompleted, OnProfileFailed, null); } function pageLoad() { LoadProfile(); } </script> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> Data: <input id="txtData" type=text /><br /> ComplexData.Data1: <input id="Text2" type=text /><br /> ComplexData.Data2: <input id="Text3" type=text /> <br /> <select id="Select1" name="links"> <option selected="selected"></option> </select> Name <input id="txtNewLink" type="text" /> Url<input id="txtNewUrl" type="text" /> <input id="btnAdd" type="button" value="Add" onclick= "AddLink()" /><br /> <div id=LinksArea> </div> <input id="Button1" type="button" value="Save Profile" onclick="SaveProfile()" /> </div> </form> </body> </html>
完成后的結(jié)果如圖4-13所示。

圖4-13
你是否有種感覺(jué),innerHTML加上div后,相當(dāng)?shù)睾糜媚兀?/p>
ProfileGroup
在多數(shù)情況下,我們都會(huì)在網(wǎng)頁(yè)載入時(shí)調(diào)用ProfileService.load函數(shù)來(lái)讀取該使用者的Profile,因此相關(guān)的Profile屬性在讀取成功后,便會(huì)定義于ProfileService.properties中,設(shè)計(jì)師可以直接訪問(wèn)這些屬性。但是若在未調(diào)用load函數(shù)情況下訪問(wèn)ProfileService.properties時(shí),這些屬性事實(shí)上是不存在的,不過(guò)由于JavaScript的語(yǔ)法,當(dāng)訪問(wèn)的變量不存在時(shí),即自動(dòng)聲明該變量,并給予undefine的值,所以這樣的寫法不會(huì)引發(fā)語(yǔ)法錯(cuò)誤。只是當(dāng)該屬性是復(fù)雜屬性,例如ComplexData時(shí),直接鍵入ProfileService.properties.ComplexData.Data1,這種語(yǔ)法就不能執(zhí)行了,因?yàn)镴avaScript雖然會(huì)為我們聲明ComplexData變量,但由于其值是默認(rèn)的undefine,訪問(wèn)其Data1變量便成了不合法的動(dòng)作,如程序4-23所示。
程序4-23
function ManualDefine() { Sys.Services.ProfileService.properties.Data = "TEST"; //不合法的訪問(wèn),因?yàn)镃omplexData是undefine. Sys.Services.ProfileService.properties.ComplexData.Data1 = "TEST1"; //不合法的訪問(wèn),因?yàn)镃omplexData是undefine. Sys.Services.ProfileService.properties.ComplexData.Data2 = "TEST2"; } function pageLoad() { //LoadProfile(); ManualDefine(); }
此時(shí)必須依賴Sys.Services中所定義的ProfileGroup對(duì)象,以程序4-24的方式來(lái)賦值。
程序4-24
function ManualDefine() { Sys.Services.ProfileService.properties.Data = "TEST"; Sys.Services.ProfileService.properties.ComplexData = new Sys.Services.ProfileGroup(); Sys.Services.ProfileService.properties.ComplexData.Data1 = "TEST1"; Sys.Services.ProfileService.properties.ComplexData.Data2 = "TEST2"; Sys.Services.ProfileService.properties.Links = new Array(2); Sys.Services.ProfileService.properties.Links[0] = "Hinet,www.hinet.net"; Sys.Services.ProfileService.properties.Links[1] = "ASP.NET,www.asp.net"; Sys.Services.ProfileService.save(null,OnSaveCompleted, OnProfileFailed,null); }
程序4-24是模擬未調(diào)用ProfileService的load函數(shù),以程序的方式來(lái)儲(chǔ)存Profile時(shí)的做法。
- Canvas LMS Course Design
- 人工智能超越人類
- Excel 2007函數(shù)與公式自學(xué)寶典
- Java實(shí)用組件集
- Photoshop CS4經(jīng)典380例
- 大數(shù)據(jù)安全與隱私保護(hù)
- 水晶石精粹:3ds max & ZBrush三維數(shù)字靜幀藝術(shù)
- Linux服務(wù)與安全管理
- Kubernetes for Serverless Applications
- Excel 2007技巧大全
- Learning Azure Cosmos DB
- 網(wǎng)站前臺(tái)設(shè)計(jì)綜合實(shí)訓(xùn)
- Hands-On Reactive Programming with Reactor
- 悟透AutoCAD 2009案例自學(xué)手冊(cè)
- 新編計(jì)算機(jī)圖形學(xué)