我遇到一个例外的问题:
“对象引用未设置为对象的实例”。
我正在尝试根据用户角色权限显示/隐藏网站上的某些元素。
Visibility属性是在后面的代码中按元素设置的,它调用具有“代号”值的方法,并返回true / false值。方法方法(听起来很奇怪)检查代号是否在数据库中。我的猜测是,当某些方法放在一个类中时,问题就产生了。 我希望有人能帮忙解决这个问题 下面是代码。我省略了存储过程,因为我认为它与此问题无关。如果需要,我会发布。
HTML / ASP
(要显示/隐藏的元素)
<li id="LoginLink" runat="server" visible='false'><a href="Login.aspx">Log ind</a></li>
<li id="CreateUserLink" runat="server" visible='false'><a href="CreateUser.aspx">Opret bruger</a></li>
<li id="MyPageLink" runat="server" visible='false'><a href="MyPage.aspx">Min side</a></li>
<li id="UserListLink" runat="server" visible='false'><a href="UserList.aspx">Brugerliste</a></li>
<li id="LogOutLink" runat="server" visible='false'><a href="LogOut.aspx">Log ud</a></li>
代码背后
(检查/设置角色;调用方法,为当前用户创建特权会话列表;使用代号调用方法,)
protected void Page_Load(object sender, EventArgs e)
{
if (Session["UserId"] == null)
{
if (Session["RoleId"] == null)
{
//RoleId 3 is guest-role
Session["RoleId"] = 3;
Per.CreatePrivilegeSession();
}
}
LoginLink.Visible = Per.Allowed("Login");
CreateUserLink.Visible = Per.Allowed("CreateUser");
MyPageLink.Visible = Per.Allowed("MyPage");
UserListLink.Visible = Per.Allowed("ShowUserList");
LogOutLink.Visible = Per.Allowed("LogOut");
}
“Per”类 - 我可能会合并此类中的方法
(调用方法,检查数据库的代码名称,当前用户有权访问;创建具有权限的会话列表;将会话列表转换为arraylist;检查arraylist以获取所请求的coednames并返回布尔值到代码隐藏)
public class Per
{
public static bool Allowed(string CodeName)
{
ArrayList Privileges = (ArrayList)HttpContext.Current.Session["Privileges"];
return Privileges.Contains(CodeName);
}
public static void CreatePrivilegeSession()
{
object RoleId = HttpContext.Current.Session["RoleId"];
//Check user privileges Privileges (Arraylist)
HttpContext.Current.Session["Privileges"] = DataBaseQueries.Privileges(RoleId);
}
}
“DataBaseQueries”类
(检查数据库的代号,当前用户有权访问并返回一个arraylist)
internal static object Privileges(object RoleId)
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString());
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "GetCurrentUserPrivilegesSP";
cmd.Parameters.Add("@RoleId", SqlDbType.Int).Value = Convert.ToInt32(RoleId);
cmd.Connection = conn;
conn.Open();
ArrayList PrivilegesList = new ArrayList();
SqlDataReader reader = cmd.ExecuteReader();
foreach (var Privilege in reader)
{
PrivilegesList.Add(reader["CodeName"]);
}
conn.Close();
return PrivilegesList;
}
更新 它与此行(ArrayList)有关,它返回null:
{Privileges.Contains(CodeName);}.
我通过将下面的代码放在内容页面而不是MasterPage中找到了问题。
if (Session["UserId"] == null)
{
if (Session["RoleId"] == null)
{
//RoleId 3 is guest-role
Session["RoleId"] = 3;
Per.CreatePrivilegeSession();
}
}
问题在于包含特权arraylist的Session变量为null,因为Per.CreatePrivilegeSession()
在MasterPage上运行,而在Per.Allowed("something")
中使用了它的结果(会话varablie“Privileges”)内容页面上的元素(未在此主题/问题中显示)取决于。
我想,在内容页面之前加载了MasterPage,它没有。