上下文:一般系統(tǒng)都會(huì)有不同的用戶角色,比如系統(tǒng)管理員admin,超級(jí)用戶manager,一般用戶worker
早先直接使用session保留一個(gè)值,如session["userType"].來判斷用戶的權(quán)限。
特點(diǎn):方便,但是畢竟不同角色,屬性數(shù)量和類型是不相同的,比如一個(gè)中介管理系統(tǒng)中:
admin:
channelID;所屬中介機(jī)構(gòu)
loginID;登陸id
realName;真實(shí)姓名
manager和worker
channelID;所屬中介機(jī)構(gòu)
loginID;登陸id
realName;真實(shí)姓名
groupID;所屬團(tuán)隊(duì)
level;級(jí)別(manager,work)
level2;附加權(quán)限
可能以后還會(huì)繼續(xù)添加更多不同屬性。
潛在問題:會(huì)有空session引用問題。
如果是admin登陸。admin是沒有g(shù)roupID變量的。但是程序中出現(xiàn) session["groupID"]這個(gè)是錯(cuò)誤的。
即使session["groupid"]賦個(gè)空直,但會(huì)有很多潛在的bug。
最先反應(yīng)的解決方案
不直接使用session而用3個(gè)類worker,manager,admin的屬性來得到(session中保留一個(gè)對象,就是這3個(gè)類的實(shí)例)
類根據(jù)session["userType"]來得到角色級(jí)別。
如:if("1"==session["userType"]){worker me=new worker()}
解決了不同角色用戶自己的變量的問題。
問題是原來可以直接通過 session["loginID"]來得到用戶登陸id?,F(xiàn)在直接用類不行了,要先得到不同類,再取直
getinfo()
{
string loginid="";
if("1"==session["userType"]){worker me=new worker();loginid=me.loginid;}
else
{....}
}
那么自然我們會(huì)想到定義基類和繼承。
解決方案之一
當(dāng)然是我們熟悉的類繼承。大家都知道繼承,但是用不用是另外一回事。
父類:baseuser
子類:worker,admin,manager
public class baseUser
{
public readonly int channelID;
public readonly string loginID;
public readonly string realName;
public readonly webenum.userType level;
public baseUser(int channelid, string loginid, string realname, webenum.userType levela)
{
channelID = channelid;
loginID = loginid;
realName = realname;
level = levela;
}
}
public class worker:baseUser
{
public readonly string level2;
public readonly int groupID;
public worker(int channelid, string loginid, string realname, string level2a, int groupid):base(channelid,loginid,realname,webenum.userType.worker)
{
level2 = level2a;
groupID = groupid;
}
}
public class manager : baseUser
{
public readonly string level2;
public readonly int groupID;
public manager(int channelid, string loginid, string realname,string level2a, int groupid)
: base(channelid, loginid, realname, webenum.userType.groupmanage)
{
level2 = level2a;
groupID = groupid;
}
}
public class admin : baseUser
{
public admin(int channelid, string loginid, string realname)
: base(channelid, loginid, realname, webenum.userType.admin)
{ }
}
看下我們怎么初始化
if ("0" == type)
{
zjpx.BLL.zj_worker bllworker = new zjpx.BLL.zj_worker();
zjpx.Model.zj_worker me= bllworker.loginCheck(loginname, psw);
if (me!=null)
{
if (me.w_level == (int)WebUtility.webenum.userType.groupmanage)
{
WebUtility.baseUser userInfo = new channelpx.WebUtility.manager(me.w_zj, me.w_name, me.w_rname,me.w_level2, me.w_tuandui);
Session["userinfo"] = userInfo;
}
else if(me.w_level==(int)WebUtility.webenum.userType.worker)
{
WebUtility.baseUser userInfo = new channelpx.WebUtility.worker(me.w_zj, me.w_name, me.w_rname, me.w_level2, me.w_tuandui);
Session["userinfo"] = userInfo;
}
}
}
//管理員
else
{
//zjpx.Model.zj_worker me = bllworker.loginCheck(loginname, psw);
if (true)
{
WebUtility.baseUser userInfo = new channelpx.WebUtility.admin(6, loginname,"");
Session["userinfo"] = userInfo;
}
}
第一個(gè)問題:不直接使用session,不會(huì)有空引用session的問題,或錯(cuò)誤session問題。
第二個(gè)問題:使用了基類,可以直接使用共有屬性。
Model.zj_worker me= bllworker.loginCheck(loginname, psw);
baseUser userInfo = new worker(me.w_zj, me.w_name, me.w_rname,me.w_level, me.w_level2, me.w_tuandui,WebUtility.webenum.userType.groupmanage);
Session["userinfo"] = userInfo;
直接使用session["userinfo"]。
要知道它是哪個(gè)子類。
可以
public static bool isgroupmanage()
{
if (HttpContext.Current.Session["userinfo"] != null && typeof(manager) == HttpContext.Current.Session["userinfo"].GetType())
{
return true;
}
else
{
return false;
}
}
之后可以轉(zhuǎn)為子類
admin myadmin=(admin)me;
ps:
1.可以寫一個(gè)自定義繼承于page的類,比如 adminpage:page
public class adminpage:basepage
{
public new WebUtility.admin me;
protected override void OnPreInit(EventArgs e)
{
base.OnPreInit(e);
if (!WebUtility.userHelper.isadmin())
{
HttpContext.Current.Response.Redirect("/nolevel.aspx");
}
else
{
me = (WebUtility.admin)base.me;
}
}
}
里面定義一個(gè)屬性public new WebUtility.admin me;(隱藏基類的me)
再讓管理員管理的頁面繼承于adminpage這個(gè)類。那么我們就可以直接使用me這個(gè)類了。還可以在adminpage里面做很多基礎(chǔ)操作。
管理員和普通登陸用戶的通用頁面可以定義屬性 baseuser(基類)
public class basepage:Page
{
public WebUtility.baseUser me;
protected override void OnPreInit(EventArgs e)
{
if (!WebUtility.userHelper.checkLogin())
{
Response.Redirect("/login.aspx", true);
}
else
{
me = (WebUtility.baseUser)Session["userinfo"];
}
base.OnPreInit(e);
}
}
繼承不同的類。我們得到的me是不同類的實(shí)例。
2.
既然提供了枚舉,還是用枚舉來替換簡單的int 的1,2,3來表示用戶級(jí)別。
如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答?。?點(diǎn)擊進(jìn)入論壇