C#:对象引用未设置为对象的实例。 (ACL)

时间:2014-03-12 09:18:27

标签: c# asp.net arraylist acl

我遇到一个例外的问题:

“对象引用未设置为对象的实例”。

我正在尝试根据用户角色权限显示/隐藏网站上的某些元素。

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,它没有。

0 个答案:

没有答案