C# 修改下拉列表中的项目

C# Modify items in drop down list

我的应用程序当前在具有 FormAuthentication 的 WebForms 应用程序中使用成员资格和角色。

我目前的角色是:
管理员
嘉宾
用户

创建了一些用户但从未分配过角色,因为它是直接在数据库中完成的(在我了解成员资格和角色的工作原理之前)。

所有分配了角色的用户都是“用户”。在数据库的 UsersInRoles table 中,所有管理员都具有“管理员”角色和“用户”角色。

下面的代码是在我从不同页面上的用户列表数据网格中单击用户之后。用户名通过 url 参数传递。

我有以下代码:

public partial class editUser : System.Web.UI.Page
    {
        public MembershipUser usr;
        string[] rolesArray;
        public string roleChoice;

        protected void Page_Load(object sender, EventArgs e)
        {
            
            if (Request.QueryString["username"] != null)
            {
                usr = Membership.GetUser(Request.QueryString["username"]);
            } else
            {
                // no user passed, so default to current user
                usr = Membership.GetUser(User.Identity.Name);  
            }

            if (!Page.IsPostBack)
            {

                // Get the list of roles and populate dropdown
                rolesArray = System.Web.Security.Roles.GetAllRoles();

                RoleDDL.DataSource = rolesArray;
                // add a "None" role to anyone that doesn't have a role assigned yet
                RoleDDL.Items.Insert(0, new ListItem("None"));
                // do not allow a user to be assigned the "Guest" role.
                RoleDDL.Items.Remove("Guest");
                RoleDDL.DataBind();

                // Set current email on page load for the user.  If username was passed then that user, otherwise the user that is logged in as an Admin
                EmailTextBox.Text = usr.Email;
                IsLockedOutCheckbox.Checked = usr.IsLockedOut;
                IsApprovedCheckbox.Checked = usr.IsApproved;

                // If the user is not locked out, disable the checkbox because you cannot set the checkbox programatically
                if (IsLockedOutCheckbox.Checked == false) 
                {
                    IsLockedOutCheckbox.Enabled = false;
                }

                // Select current role for user
                string[] currentUserRoles = System.Web.Security.Roles.GetRolesForUser(usr.UserName);
                // Choose the current user role from currentUserRoles and assign to DDL.  Always choose Admin if it exists, User only if Admin doesn't exist, and None if no roles.
                foreach (string value in currentUserRoles) {
                    if (System.Web.Security.Roles.IsUserInRole(usr.UserName, "Admin")) 
                    {
                        RoleDDL.SelectedValue = "Admin";
                        break;  // "Admin" users are also "Users" users so break out of the for loop.  Otherwise the drop down will select "Users".
                    }

                    if (System.Web.Security.Roles.IsUserInRole(usr.UserName, "Users"))
                    {
                        RoleDDL.SelectedValue = "Users";
                    }
                    else
                    {
                        RoleDDL.SelectedValue = "None";
                    }

                }
            }

        }
}

运行我的代码后的下拉列表如下:

管理员
嘉宾
用户

我的问题是:

  1. 删除“访客”失败,但仍显示在我的下拉列表中。
  2. 我无法让“None”出现在我的下拉列表中。

我希望用户仅 select None、管理员或用户。
我不会让 None 被保存 - 这将给出一个错误,必须选择不同的角色。
我会检查当前下拉菜单 selection 是否与他们所处的角色匹配。

如果有变化则:
对于管理员,我将为“管理员”添加角色。
对于用户,我将检查他们是否是管理员,如果是,则检查 RemoveRole("Admin")。
对于没有角色的用户(currentUserRoles 为空),我将添加一个“用户”角色。

我以访客身份使用只读方式浏览网站。我不想选择这个。

大多数下拉菜单也会有一个 key/item 和值。我从未将角色分配给下拉列表,所以我只在执行“RoleDDL.datasource = rolesArray”时才分配 key/item 吗?

我做错了什么?

我认为您可以尝试在 rolesArray 中添加 None 并删除 Guest,而不是在 RoleDDL 中进行。因为我们可以看到您在 RoleDDL 中所做的修改没有像您预期的那样工作。

您也可以尝试“覆盖”Guest 角色,因为如果我理解正确的话,所有具有 Guest 角色的成员都应该拥有 None 角色。因此,如果您将 Guest 更改为停止显示 Guest,而是显示 None,那么您不必更改数据库的行为,而只需更改显示。

根据 MSDNDataBindDataSource 绑定到控件(在本例中为 DropDownList)。

这意味着任何先前的数据都将被丢弃,并且来自 DataSource 的数据将被复制到控件中。

在您的情况下,问题是您在插入和删除项目后调用了 DropDownList.DataBind()。要解决您的问题,您需要在更改 DropDownList.DataSource 后调用 DropDownList.DataBind() 并在绑定数据后调用 Items.InsertItems.Remove。这两种方法都会自行进行绑定。

// [...]
RoleDDL.DataSource = rolesArray;
// Bind the DataSource
RoleDDL.DataBind(); 
// Both of these will perform the binding on their own.
RoleDDL.Items.Insert(0, new ListItem("None"));
RoleDDL.Items.Remove("Guest");
// [...]