MataHari
MataHari

Reputation: 318

Manage Roles for Users in MVC 3 application

I am trying to add and delete aspnet roles for any user in a MVC 3 application.

I only need to work with 3 tables which are described below.

My problems are:

  1. I need to display the user's existing selected Roles, and other roles available but not selected for the user using "Checkboxes"

  2. I need to save the selected values to table aspnet_UsersInRoles table

This is what I have done so far:

  1. I have created ViewModels called AssignedRolesData.cs
  2. I have altered the models for aspnet_Users and aspnet_Users to hold the icollection navigation properties for aspnet_UsersInRoles
  3. I have created a method for the UserController Called "PopulateAssignedRoleData" to populate the existing Roles per user

My problems:

  1. I cannot get the selected roles into the checkboxes
  2. I don't know how to save them afterwards
  3. The keys are of type GUID

Models

**using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace WWW.Models
{
    public class aspnet_Roles
    {

        public Guid ApplicationId { get; set; }
        [Key]
        public Guid RoleId { get; set; }
        public string RoleName { get; set; }
        public string LoweredRoleName { get; set; }
        public string Description { get; set; }
        public virtual ICollection<aspnet_Users> aspnet_User { get; set; }
    }
}
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace WWW.Models
{
    public class aspnet_Users
    {
        public Guid ApplicationId { get; set; }
        [Key]
        public Guid UserId { get; set; }
        public string UserName { get; set; }
        public string LoweredUserName { get; set; }
        public string MobileAlias { get; set; }
        public bool IsAnonymous { get; set; }
        public DateTime LastActivityDate { get; set; }
        public virtual ICollection<aspnet_Roles> aspnet_Role { get; set; }
    }
}**

ViewModels

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace WWW.ViewModels
{
    public class AssignedRolesData
    {
        public Guid RoleId { get; set; }
        public string RoleName { get; set; }
        public bool Assigned { get; set; }
    }
}

UserController

   public ActionResult Edit(Guid id)
        {
            aspnet_Users aspnet_User = db.aspnet_Users
            .Include(i => i.UserId)
                //.Include(i => i.aspnet_User)
            .Where(i => i.UserId == id)
            .Single();
            PopulateAssignedRoleData(aspnet_User);
            return View(aspnet_User);

        }


 private void PopulateAssignedRoleData(aspnet_Roles aspnet_Role)
        {
            var allaspnet_Users = db.aspnet_Users;
            var UsersInRoles = new HashSet<Guid>(aspnet_Role.aspnet_User.Select(c => c.UserId));
            var viewModel = new List<AssignedRolesData>();
            foreach (var user in allaspnet_Users)
            {
                viewModel.Add(new AssignedRolesData
                {
                    RoleId = aspnet_Role.RoleId,
                    RoleName = aspnet_Role.RoleName,
                    Assigned = UsersInRoles.Contains(aspnet_Role.RoleId)
                });
            }
            ViewBag.Courses = viewModel;
        }

My Edit View

<div class="editor-field">
            <table>
                <tr>
                    @{
                        int cnt = 0;
                        List<www.ViewModels.AssignedRolesData> Roles = ViewBag.aspnet_Role;

                        foreach (var Role in Roles)
                        {
                            if (cnt++ % 3 == 0) {
                                @:  </tr> <tr> 
                            }
                            @: <td> 
                                <input type="checkbox" 
                                       name="selectedRoles" 
                                       value="@Role.RoleId" 
                                       @(Html.Raw(Role.Assigned ? "checked=\"checked\"" : "")) /> 
                                @Role.RoleId @:  @Role.RoleName
                            @:</td>
                        }
                        @: </tr>
                    }
            </table>
        </div>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>

Tables

aspnet_Users Table  
ApplicationId   uniqueidentifier
UserId  uniqueidentifier
UserName    nvarchar(256)
LoweredUserName nvarchar(256)
MobileAlias nvarchar(16)
IsAnonymous bit
LastActivityDate    datetime


aspnet_Roles Table  
ApplicationId   uniqueidentifier
RoleId  uniqueidentifier
RoleName    nvarchar(256)
LoweredRoleName nvarchar(256)
Description nvarchar(256)



aspnet_UsersInRoles Table   
UserId  uniqueidentifier
RoleId  uniqueidentifier

Upvotes: 1

Views: 2426

Answers (1)

Garrett Fogerlie
Garrett Fogerlie

Reputation: 4458

You need to post you view so we can see how you are trying to create the check boxes.

To answer your second problem, you can do something like this:

public ActionResult UpdateRoles(string userName, string[] roles)
{
    // Remove the user from all roles, you could use more logic
    // to see what the changes are and if you need to remove a role
    // but this is just to get you started
    string[] userRoles = Roles.GetRolesForUser(user.UserName);        
    if(userRoles.Count() > 0)
    {
        foreach(string role in userRoles)
        {
            Roles.RemoveUserFromRoles(userName, role);
        }
    }

    // then you just add the user to the submitted roles
    foreach(string role in roles)
    {
        Roles.AddUserToRole(UserName, role);
    }

Upvotes: 1

Related Questions