繁体   English   中英

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

[英]C# Modify items in drop down list

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

我目前的角色是:
行政
来宾
用户

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

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

下面的代码是在我从不同页面上的用户列表数据网格中单击用户之后。 用户名通过 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. 我的下拉列表中无法显示“无”。

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

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

我使用 Guest 作为角色以只读方式浏览该站点。 我不希望这是一个选择。

此外,大多数下拉菜单都会有一个键/项目和值。 我从未将角色分配给下拉列表,所以我是否只在执行“RoleDDL.datasource = 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");
// [...]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM