ASP.Net中有一套與用戶相關聯的屬性設置,可以通過在WebConfig裡配置來直接使用,他的作用為
- 存儲和使用唯一與用戶對應的信息
- 展現個人化版本的Web應用程序
- 用戶的唯一身份標識在再次訪問時識別用戶
ASP.Net Profile提供的跟用戶相關的類型都是強類型
首先生成數據庫腳本,使用Visual Studio 2005 命令提示,輸入命令行ASPnet_regsql -A p -sqlexportonly filename
- -A:表明增加一個數據庫
- p:表明生成的是Profile的數據庫
- -sqlexportonly:表明是倒出sql腳本,用其他參數可以直接創建數據庫,具體的說明可以參看ASPnet_regsql的幫助說明
- filename:保存的文件名
現在數據庫創建好了,裡面有4張表aspnet_Application用來存儲應用程序的相關類型,aspnet_Profile用來保存用戶的屬性信息,aspnet_SchemaVersion用來存儲版本信息,ASPnet_User用來保存用戶信息。可以從這幾張表可以看到,多個應用程序可以用同一個數據庫來表示用戶信息。
下面是如何來配置WebConfig來支持Profile
首先配置連接字符串
<connectionStrings>
<add name="ProfileDatabase" connectionString="Server=192.168.1.2; Initial Catalog=ASPnetdb; User ID=sa; PassWord=sa"/>
</connectionStrings>
然後在system.web節點下添加profile節點
<profile enabled="true" automaticSaveEnabled="true" defaultProvider="SqlProvider">
<providers>
<clear />
<add name="SqlProvider"
type="System.Web.Profile.SqlProfileProvider"
connectionStringName="ProfileDatabase"
applicationName="ProfileSample"
description="Sample for ASP.Net profile and Profile Service" />
</providers>
<propertIEs>
<add name="Name" type="System.String"/>
<add name="Email" type="System.String" />
<add name="Age" type="System.Int32" />
<group name="Address">
<add name="City" type="System.String" />
<add name="Street" type="System.String" />
<add name="PostalCode" type="System.String" />
</group>
</propertIEs>
</profile>
詳細說明一下。automaticSaveEnalbed="true",表明用戶在提交數據之後,自動保存用戶屬性。propertIEs節點下面就是用戶需要配置的自己的用戶屬性,group表明這是一個組,相當與這個屬性是一個對象,他保存其他的信息。在每個屬性後面都有一個允許匿名用戶訪問的屬性,這個是默認選項,可以不用輸入。有時候配置了系統報需要使用匿名授權模式,那麼在system.web節點下添加就可以解決這個問題。
下面是使用ASP.Net的Profile屬性,不涉及到AJax。
首先讓用戶登陸,那麼我們需要讓系統記錄這個用戶,並把他設置為登陸狀態。
FormsAuthentication.SetAuthCookIE(this.txtUserName.Text, false);
第二個參數表明是否跨浏覽器保持會話狀態
,退出登陸使用
FormsAuthentication.SignOut();
下面是讀取Profile
protected void btnShowProfile_Click(object sender, EventArgs e)
...{
if (this.Profile.Age == 0)
...{
txtName.Text = string.Empty;
txtAge.Text = string.Empty;
txtEmail.Text = string.Empty;
txtCity.Text = string.Empty;
txtStreet.Text = string.Empty;
txtPostalCode.Text = string.Empty;
this.lblMessage.Text = this.User.Identity.Name + ": No Profile";
}
else
...{
txtName.Text = this.Profile.Name;
txtAge.Text = this.Profile.Age.ToString();
txtEmail.Text = this.Profile.Email;
txtCity.Text = this.Profile.Address.City;
txtStreet.Text = this.Profile.Address.Street;
txtPostalCode.Text = this.Profile.Address.PostalCode;
this.lblMessage.Text = this.User.Identity.Name + ": Profile Loaded";
}
}
我們首先判斷Profile裡面的Age屬性是否為0,其實可以判斷任何一個屬性。然後將Profile裡面的屬性給一一賦值到顯示屬性上。如果碰到了group節點上的屬性,可以象使用對象裡的屬性一樣使用。
然後是保存Profile
protected void btnSaveProfile_Click(object sender, EventArgs e)
...{
this.Profile.Name = this.txtName.Text;
this.Profile.Age = Int32.Parse(this.txtAge.Text);
this.Profile.Email = this.txtEmail.Text;
this.Profile.Address.City = this.txtCity.Text;
this.Profile.Address.Street = this.txtStreet.Text;
this.Profile.Address.PostalCode = this.txtPostalCode.Text;
this.lblMessage.Text = this.User.Identity.Name + ": Profile Saved";
}
可以看到上面這段代碼我們沒有顯視的保存Profile,當一個Profile的屬性改變時,提交到服務器,Profile的屬性會自動保存到數據庫。碰到group節點的使用方法也一樣。
這就是簡單的Profile的在ASP.Net裡面的應用。
下面我們來看看在ASP.Net AJax裡面怎麼使用Profile。首先我們在system.web.extensions節點下的scripting節點下的webServices節點下添加一個節點
<profileService enabled="true"
readAccessPropertIEs="Name, Age, Email, Address.City, Address.Street, Address.PostalCode"
writeAccessPropertIEs="Name, Age, Email, Address.City, Address.Street, Address.PostalCode" />
readAccessPropertIEs時允許讀取的Profile屬性。writeAccessPropertIEs時允許寫入的Profile屬性
然後我們在頁面上需要添加一個ScriptManager
<ASP:ScriptManager ID="ScriptManager1" runat="server">
<ProfileService LoadPropertIEs="Name, Age, Email, Address.City, Address.Street, Address.PostalCode" />
</ASP:ScriptManager>
LoadPropertIEs表明預加載的Profile的屬性。
首先時讀取Profile的屬性
function loadProfiles()
...{
//debugger;
Sys.Services.ProfileService.load(
null,
loadCompleted);
}
Sys.Services.ProfileService.load的方法詳細說明如下
Sys.Services.ProfileService.load(
propertyNames, //需要加載的Profile名,null表示全取
loadCompletedCallback, //加載成功的回調函數
failedCallback, //加載失敗的回調函數
userContext// 可以隨意指定的上下文對象
);
讀取完成之後
function loadCompleted()
...{
//debugger;
var properties = Sys.Services.ProfileService.propertIEs;
if(propertIEs.Age)
...{
$get("txtName").value = propertIEs.Name;
$get("txtAge").value = propertIEs.Age;
$get("txtCity").value = propertIEs.Address.City;
$get("txtEmail").value = propertIEs.Email;
$get("txtStreet").value = propertIEs.Address.Street;
$get("txtPostalCode").value = propertIEs.Address.PostalCode;
$get("message").innerHtml = "Profile Loaded";
}
else
...{
$get("txtName").value = "";
$get("txtAge").value = "";
$get("txtCity").value = "";
$get("txtEmail").value = "";
$get("txtStreet").value = "";
$get("txtPostalCode").value = "";
$get("message").innerHtml = "Profile not Loaded";
}
}
Sys.Service.ProfileService.propertIEs存儲的就是Profile裡面的屬性,可以直接使用Name、Age等屬性。loadCompleted是存在參數的,這裡我們只是省略了。
function loadCompletedCallback(
number, // 本次加載的Profile數量
userContext, // 用戶隨意指定的上下文對象
methodName//即"Sys.Services.ProfileService.load"
)
讀取失敗的回調函數
function failedCallback(
error, // 錯誤對象
userContext, // 用戶隨意指定的上下文對象
methodName//即"Sys.Services.ProfileService.load"
)
然後就是保存Profile的屬性
function saveProfiles()
...{
var properties = Sys.Services.ProfileService.propertIEs;
propertIEs.Name = $get("txtName").value;
propertIEs.Age = parseInt($get("txtAge").value, 10);
propertIEs.Email = $get("txtEmail").value;
propertIEs.Address.City = $get("txtCity").value;
propertIEs.Address.Street = $get("txtStreet").value;
propertIEs.Address.PostalCode = $get("txtPostalCode").value;
Sys.Services.ProfileService.save(null, saveCompleted);
}
碰到象Address這樣的group標簽標明的屬性可以使用JSon字符串來設置,並且使用propertIEs.save方法來轉換城Address的屬性
properites.Address = ...{City : “Shanghai”,
Street: “People Square”, PostalCode: “20002”};
propertIEs.save(…);
注意,就算在webconfig裡設置了自動保存的屬性,在AJax裡面也不會自動保存,需要調用Sys.Services.ProfileService.save方法進行保存。save方法的完整簽名如下
Sys.Services.ProfileService.save(
propertyNames, //需要保存的Profile名,null表示全取
saveCompletedCallback, //保存成功的回調函數
failedCallback, //加載失敗的回調函數
userContext// 可以隨意指定的上下文對象
);
保存成功的回調函數的完整簽名
function saveCompletedCallback(
number, // 本次保存的Profile數量
userContext, // 用戶隨意指定的上下文對象
methodName//即“Sys.Services.ProfileService.save”
)
保存失敗的回調函數的完整簽名
function failedCallback(
error, // 錯誤對象
userContext, // 用戶隨意指定的上下文對象
methodName//即"Sys.Services.ProfileService.save"
)
ProfileService的其他屬性
- get_timeout()/set_timeout(time):設置或得到超時時間
- defaultLoadCompletedCallback:默認讀取完成屬性,指定一個函數地址,函數簽名與loadCompletedCallback類似
- defaultSaveCompletedCallback:默認保存完成屬性,指定一個函數地址,函數簽名與saveCompletedCallback類似
- defaultFailedCallback:默認讀取或保存失敗屬性,指定一個函數地址,函數簽名與failedCallback類似