public ActionResult Create2()
        {
            var viewModel = new CreateUserFormViewModel2();

            viewModel.AllRolesList = RoleManager.Roles.ToList().Select(x => new UserRole()
            {
                IsSelected = false,
                RoleId     = x.Id,
                RoleName   = x.Name
            }).ToList();


            viewModel.AllClaimsList = ClaimsStore.AllClaims.Select(x => new UserClaim()
            {
                IsSelected = false,
                ClaimType  = x.Type,
                ClaimValue = x.Value,
            }).ToList();

            return(View("CreateUserForm2", viewModel));
        }
        public async Task <ActionResult> Create2(CreateUserFormViewModel2 viewModel)
        {
            // selectedRole is the name of the checkbox list on the html form

            // HERE WE ARE USING SAME FORM & VIEWMODEL FOR ADD & EDIT
            // BUT BOTH SCENARIOS ARE DIFFERENT,
            // ADD NEED PASSWORD & CONFIRM PASSWORD IN VIEW & VIEWMODEL & THEY ARE MANDATORY
            // WITH THEM MODEL WILL BE NOT VALIDATED
            // EDIT DO NOT NEED PASSWORD & CONFIRM PASSWORD IN VIEW & VIEWMODEL
            // MODEL VALIDATION WILL STOP US FROM EDITING USER AND WILL ASK FOR PASSWORKD & CONFIRM PASSWORD
            // SPLIT VIEWS & VIEWMODELS FOR ADD & EDIT

            IdentityResult  result = null;
            ApplicationUser user   = null;


            if (!ModelState.IsValid)
            {
                // Invalid Model, all Model Errors will be auto shown, no need to add yourself
                // Model has those Error Messages in it & Shown Automatically.
                ModelState.AddModelError("", "Something failed.");

                viewModel.AllRolesList = RoleManager.Roles.ToList().Select(x => new UserRole()
                {
                    IsSelected = false,
                    RoleId     = x.Id,
                    RoleName   = x.Name
                }).ToList();


                viewModel.AllClaimsList = ClaimsStore.AllClaims.Select(x => new UserClaim()
                {
                    IsSelected = false,
                    ClaimType  = x.Type,
                }).ToList();

                return(View("CreateUserForm2", viewModel));
            }

            // New User
            user = new ApplicationUser
            {
                UserName       = viewModel.Email,
                Email          = viewModel.Email,
                DrivingLicense = viewModel.DrivingLicense,
                Phone          = viewModel.Phone,
            };


            result = await UserManager.CreateAsync(user, viewModel.Password);

            if (!result.Succeeded)
            {
                // Error occures while Adding New User
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError("", error);
                }

                viewModel.AllRolesList = RoleManager.Roles.ToList().Select(x => new UserRole()
                {
                    IsSelected = false,
                    RoleId     = x.Id,
                    RoleName   = x.Name
                }).ToList();


                viewModel.AllClaimsList = ClaimsStore.AllClaims.Select(x => new UserClaim()
                {
                    IsSelected = false,
                    ClaimType  = x.Type,
                    ClaimValue = x.Value,
                }).ToList();

                return(View("CreateUserForm2", viewModel));
            }


            // New User Added Successfully now add it roles
            if (viewModel.IsAnyRoleSelected() == false)
            {
                ViewBag.Message = "Record(s) addded successfully.";
                return(List());
            }

            // If some roles are selected for New User, Add those roles
            result = await UserManager.AddToRolesAsync(user.Id, viewModel.GetSelectedRoles());

            // Errors occurs while adding Roles to New user
            if (!result.Succeeded)
            {
                // Error occurs while adding roles
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError("", error);
                }

                viewModel.AllRolesList = RoleManager.Roles.ToList().Select(x => new UserRole()
                {
                    IsSelected = false,
                    RoleId     = x.Id,
                    RoleName   = x.Name
                }).ToList();


                viewModel.AllClaimsList = ClaimsStore.AllClaims.Select(x => new UserClaim()
                {
                    IsSelected = false,
                    ClaimType  = x.Type,
                    ClaimValue = x.Value,
                }).ToList();

                return(View("CreateUserForm2", viewModel));
            }

            List <Claim> selectedClaimsOnForm = viewModel.GetSelectedClaims();

            // Adding Claim Array
            foreach (var claim in selectedClaimsOnForm)
            {
                result = await UserManager.AddClaimAsync(user.Id, claim);
            }


            if (!result.Succeeded)
            {
                // Error occurs while adding roles
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError("", error);
                }

                viewModel.AllRolesList = RoleManager.Roles.ToList().Select(x => new UserRole()
                {
                    IsSelected = false,
                    RoleId     = x.Id,
                    RoleName   = x.Name,
                }).ToList();


                viewModel.AllClaimsList = ClaimsStore.AllClaims.Select(x => new UserClaim()
                {
                    IsSelected = false,
                    ClaimType  = x.Type,
                    ClaimValue = x.Value,
                }).ToList();

                return(View("CreateUserForm2", viewModel));
            }

            ViewBag.Message = "Record(s) addded successfully.";
            return(List());
        }