我們首先判斷Profile里面的Age屬性是否為0,其實(shí)可以判斷任何一個屬性。然后將Profile里面的屬性給一一賦值到顯示屬性上。如果碰到了group節(jié)點(diǎn)上的屬性,可以象使用對象里的屬性一樣使用。
然后是保存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,當(dāng)一個Profile的屬性改變時,提交到服務(wù)器,Profile的屬性會自動保存到數(shù)據(jù)庫。碰到group節(jié)點(diǎn)的使用方法也一樣。
這就是簡單的Profile的在Asp.Net里面的應(yīng)用。
下面我們來看看在Asp.Net Ajax里面怎么使用Profile。首先我們在system.web.extensions節(jié)點(diǎn)下的scripting節(jié)點(diǎn)下的webServices節(jié)點(diǎn)下添加一個節(jié)點(diǎn)
<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表明預(yù)加載的Profile的屬性。
首先時讀取Profile的屬性
function loadProfiles()
{
//debugger;
Sys.Services.ProfileService.load(
null,
loadCompleted);
}
Sys.Services.ProfileService.load的方法詳細(xì)說明如下
Sys.Services.ProfileService.load(
propertyNames, //需要加載的Profile名,null表示全取
loadCompletedCallback, //加載成功的回調(diào)函數(shù)
failedCallback, //加載失敗的回調(diào)函數(shù)
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是存在參數(shù)的,這里我們只是省略了。
function loadCompletedCallback(
number, // 本次加載的Profile數(shù)量
userContext, // 用戶隨意指定的上下文對象
methodName//即"Sys.Services.ProfileService.load"
)
讀取失敗的回調(diào)函數(shù)
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標(biāo)簽標(biāo)明的屬性可以使用JSon字符串來設(shè)置,并且使用properties.save方法來轉(zhuǎn)換城Address的屬性
properites.Address = {City : “Shanghai”,
Street: “People Square”, PostalCode: “20002”};
properties.save(…);
注意,就算在webconfig里設(shè)置了自動保存的屬性,在ajax里面也不會自動保存,需要調(diào)用Sys.Services.ProfileService.save方法進(jìn)行保存。save方法的完整簽名如下
Sys.Services.ProfileService.save(
propertyNames, //需要保存的Profile名,null表示全取
saveCompletedCallback, //保存成功的回調(diào)函數(shù)
failedCallback, //加載失敗的回調(diào)函數(shù)
userContext// 可以隨意指定的上下文對象
);
保存成功的回調(diào)函數(shù)的完整簽名
function saveCompletedCallback(
number, // 本次保存的Profile數(shù)量
userContext, // 用戶隨意指定的上下文對象
methodName//即“Sys.Services.ProfileService.save”
)
保存失敗的回調(diào)函數(shù)的完整簽名
function failedCallback(
error, // 錯誤對象
userContext, // 用戶隨意指定的上下文對象
methodName//即"Sys.Services.ProfileService.save"
)
ProfileService的其他屬性
get_timeout()/set_timeout(time):設(shè)置或得到超時時間
defaultLoadCompletedCallback:默認(rèn)讀取完成屬性,指定一個函數(shù)地址,函數(shù)簽名與loadCompletedCallback類似
defaultSaveCompletedCallback:默認(rèn)保存完成屬性,指定一個函數(shù)地址,函數(shù)簽名與saveCompletedCallback類似
defaultFailedCallback:默認(rèn)讀取或保存失敗屬性,指定一個函數(shù)地址,函數(shù)簽名與failedCallback類似