官术网_书友最值得收藏!

  • 決戰(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所示。

true

圖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>
            &nbsp;Name&nbsp;
            <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()" />&nbsp;
        </div>
        </form>
    </body>
    </html>

執(zhí)行此程序后,就可以在ProfileTest.aspx中新增鏈接,這些鏈接信息會(huì)以<名稱>,<Url>的方式存在Profile的Links屬性中,而Links屬性是一個(gè)字符串?dāng)?shù)組,這代表著用戶可儲(chǔ)存1 個(gè)以上的鏈接信息至Links屬性中,如圖4-12所示。

true

圖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>
            &nbsp;Name&nbsp;
            <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()" />&nbsp;
        </div>
        </form>
    </body>
    </html>

完成后的結(jié)果如圖4-13所示。

true

圖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í)的做法。

主站蜘蛛池模板: 修水县| 六盘水市| 缙云县| 同江市| 旅游| 夹江县| 忻城县| 高淳县| 康定县| 长垣县| 墨江| 莱芜市| 密云县| 梨树县| 甘孜县| 斗六市| 光泽县| 利川市| 达日县| 泰来县| 新邵县| 简阳市| 棋牌| 沙河市| 福州市| 都昌县| 弋阳县| 沂源县| 宁武县| 高邑县| 深水埗区| 漾濞| 辉县市| 吐鲁番市| 吴忠市| 济阳县| 新乐市| 山阳县| 海阳市| 迁安市| 泸溪县|