Search This Blog

Saturday, July 14, 2018

Part 5 : How to create User Role based Login Form in MVC with help of Ajax/JQuery (How to create a custom role-based page authorization using custom Authorize filter)









Now we had complicated Simple page and simple authorization now move ahead to create page of EDIT, DELETE, READ, UPDATE by using partial view and JQuery and Ajax.

Add code in properties
public class UserDetailView
    {
        [Key]
        public int UserID { get; set; }
        public int RoleID { get; set; }
        public string RoleName { get; set; }
        public bool? IsActive { get; set; }
        [Required(ErrorMessage = "*")]
        [Display(Name = "User Name")]
        public string UserName { get; set; }
        [Required(ErrorMessage = "*")]
        [Display(Name = "Password")]
        public string Password { get; set; }
        [Required(ErrorMessage = "*")]
        [Display(Name = "First Name")]
        public string FirstName { get; set; }
        [Required(ErrorMessage = "*")]
        [Display(Name = "Last Name")]
        public string LastName { get; set; }
        public string Gender { get; set; }
    }

    public class UserRoleDetailView
    {
        [Key]
        public int RoleID { get; set; }
        public string RoleName { get; set; }
        public string Description { get; set; }
    }

    public class Gender
    {
        public string Text { get; set; }
        public string Value { get; set; }
    }

    public class UserRoles
    {
        public int? SelectedRoleID { get; set; }
        public IEnumerable<UserRoleDetailView> userRoleDetails{ get; set; }
    }

    public class UserGender
    {
        public string SelectedGender { get; set; }
        public IEnumerable<Gender> Gender { get; set; }
    }

    public class UserDataView
    {
        public IEnumerable<UserDetailView> userDetailViews { get; set; }
        public UserRoles UserRoles { get; set; }
        public UserGender UserGender { get; set; }
    }


Now add code in Method


        public List<UserRoleDetailView> GetAllRoles()
        {
            using (StoreDBContext  db = new StoreDBContext ())
            {
                var roles = db.UserRoles.Select(m =>
                new UserRoleDetailView
                {
                    RoleID = m.RoleID,
                    RoleName = m.RoleName,
                    Description = m.Description
                }).ToList();
                return roles;
            }

        }

        public int GetUserID(string UserName)
        {
            using (StoreDBContext  db = new StoreDBContext ())
            {
                return db.UsersLogins.Where(m =>
              m.Username.Equals(UserName )).SingleOrDefault().Id ;
            }

        }

        public List<UserDetailView> GetAllUserProfiles()
        {
            List<UserDetailView> userDetailViews = new List<UserDetailView>();
            using (StoreDBContext  db = new StoreDBContext ())
            {
                UserDetailView userDetailViews1 ;
                var users = db.UsersLogins.ToList();

                foreach (UsersLogin userlogin in db.UsersLogins)
                {
                    userDetailViews1 = new UserDetailView();
                    userDetailViews1.UserID = userlogin.Id;
                    userDetailViews1.UserName = userlogin.Username;
                    userDetailViews1.Password = userlogin.Password;

                    var Udetail = db.UserDetails.Find(userlogin.Id);
                    if (Udetail != null)
                    {
                        userDetailViews1.FirstName = Udetail.FirstName;
                        userDetailViews1.LastName = Udetail.LastName;
                        userDetailViews1.Gender = Udetail.Gendar;
                    }

                    var URoles = db.UserRoles.Where(m => m.UserID.Equals(userlogin.Id));
                   Boolean  Iactive = true ; // For active we code latter
                    if (URoles.Any())
                    {
                        var userRole = URoles.FirstOrDefault();
                        userDetailViews1.RoleID = userRole.RoleID;
                        userDetailViews1.RoleName = userRole.RoleName ;
                        userDetailViews1.IsActive = Iactive;
                    }

                    userDetailViews.Add(userDetailViews1);
                }
            }

            return userDetailViews;
        }

        public UserDataView GetUserDataView(string loginName)
        {
            UserDataView userDataView  = new UserDataView();
            List<UserDetailView> userDetailViews  = GetAllUserProfiles();
            List<UserRoleDetailView > roles = GetAllRoles();

            int? userAssignedRoleID = 0, userID = 0;
            string userGender = string.Empty;

            userID = GetUserID(loginName);
            using (StoreDBContext  db = new StoreDBContext())
            {
                userAssignedRoleID = db.UserRoles.Where(m =>
                m.UserID == userID)?.FirstOrDefault().RoleID;
                userGender = db.UserDetails.Where(m =>
                m.UserID == userID)?.FirstOrDefault().Gendar;
            }

            List<Gender> genders = new List<Gender>();
            genders.Add(new Gender { Text = "Male", Value = "M" });
            genders.Add(new Gender { Text = "Female", Value = "F" });

            userDataView.userDetailViews   = userDetailViews;
            userDataView.UserRoles = new UserRoles
            {
                SelectedRoleID =
                userAssignedRoleID,
                userRoleDetails = roles
            };
            userDataView.UserGender = new UserGender
            {
                SelectedGender = userGender,
                Gender = genders
            };
            return userDataView;
        }

        public void UpdateUserAccount(UserDetailView userDetailView)
        {

            using (StoreDBContext  db = new StoreDBContext())
            {
                using (var dbContextTransaction = db.Database.BeginTransaction())
                {
                    try
                    {

                        UsersLogin usersLogin  = db.UsersLogins.Find(userDetailView.UserID);
                        userDetailView.UserName = userDetailView.UserName;
                        userDetailView.Password = userDetailView.Password;
                        db.SaveChanges();

                        var userProfile = db.UserDetails.Where(m =>
                        m.UserID == userDetailView.UserID);
                        if (userProfile.Any())
                        {
                            UserDetail userDetail  = userProfile.FirstOrDefault();
                            userDetail.UserID = userDetailView.UserID;
                            userDetail.FirstName = userDetailView.FirstName;
                            userDetail.LastName = userDetailView.LastName;
                            userDetail.Gendar = userDetailView.Gender;
                            db.SaveChanges();
                        }

                        if (userDetailView.RoleID > 0)
                        {
                            var userRole = db.UserRoles.Where(m =>
                            m.UserID == userDetailView.UserID);
                            UserRole userRoles = null;
                            if (userRole.Any())
                            {
                                userRoles= userRole.FirstOrDefault();
                                userRoles.RoleID = userDetailView.RoleID;
                                userRoles.UserID = userDetailView.UserID;
                               
                            }
                            else
                            {
                                userRoles = new UserRole();
                                userRoles.RoleID = userDetailView.RoleID;
                                userRoles.UserID = userDetailView.UserID;
                                db.UserRoles.Add(userRoles);
                            }

                            db.SaveChanges();
                        }
                        dbContextTransaction.Commit();
                    }
                    catch
                    {
                        dbContextTransaction.Rollback();
                    }
                }
            }
        }

        public void DeleteUser(int userID)
        {
            using (StoreDBContext  db = new StoreDBContext ())
            {
                using (var Transaction = db.Database.BeginTransaction())
                {
                    try
                    {

                        var
                            uRol= db.UserRoles.Where(m => m.UserID == userID);
                        if (uRol.Any())
                        {
                            db.UserRoles.Remove(uRol.FirstOrDefault());

                            db.SaveChanges();
                        }

                        var uDetails = db.UserDetails.Where(m => m.UserID == userID);
                        if (uDetails.Any())
                        {
                            db.UserDetails.Remove(uDetails.FirstOrDefault());
                            db.SaveChanges();
                        }

                        var Ulogin = db.UsersLogins.Where(m => m.Id == userID);
                        if (Ulogin.Any())
                        {
                            db.UsersLogins.Remove(Ulogin.FirstOrDefault());
                            db.SaveChanges();
                        }

                        Transaction.Commit();
                    }
                    catch { Transaction.Rollback(); }
                }
            }
        }

        public UserDetailView GetUserProfile(int userID)
        {
            UserDetailView userDetailView  = new UserDetailView ();
            using (StoreDBContext db = new StoreDBContext())
            {
                var user = db.UsersLogins.Find(userID);
                if (user != null)
                {
                    userDetailView.UserID = user.Id;
                    userDetailView.UserName = user.Username;
                    userDetailView.Password = user.Password;

                    var UDetail = db.UserDetails.Find(userID);
                    if (UDetail != null)
                    {
                        userDetailView.FirstName = UDetail.FirstName;
                        userDetailView.LastName = UDetail.LastName;
                        userDetailView.Gender = UDetail.Gendar;
                      
                    }

                    var Urol = db.UserRoles.Find(userID);
                    if (Urol != null)
                    {
                        userDetailView.RoleID = Urol.RoleID;
                        userDetailView.RoleName = Urol.RoleName;
                      }
                }
            }
            return userDetailView;
        }

Now Add in Controller

[Authorization("Admin")]
        public ActionResult ManageUserPartial(string status = "")
        {
            if (User.Identity.IsAuthenticated)
            {
                string UserName = User.Identity.Name;
                MethodManager methodManager  = new MethodManager ();
                UserDataView userDataView  = methodManager.GetUserDataView(UserName);

                string message = string.Empty;
                if (status.Equals("update"))
                    message = "Update Successful";
                else if (status.Equals("delete"))
                    message = "Delete Successful";

                ViewBag.Message = message;

                return PartialView(userDataView );
            }

            return RedirectToAction("Index", "Home");
        }

        [Authorization("Admin")]
        public ActionResult UpdateUserData(int userID, string UserName, string password, string firstName, string lastName, string gender, int roleID = 0)
        {
            UserDetailView userDetailView = new UserDetailView ();
            userDetailView.UserID = userID;
            userDetailView.UserName = UserName;
            userDetailView.Password = password;
            userDetailView.FirstName = firstName;
            userDetailView.LastName = lastName;
            userDetailView.Gender = gender;

            if (roleID > 0)
                userDetailView.RoleID = roleID;

            MethodManager methodManager = new MethodManager();
            methodManager.UpdateUserAccount(userDetailView);

            return Json(new { success = true });
        }

        [Authorization("Admin")]
        public ActionResult DeleteUser(int userID)
        {
            MethodManager methodManager  = new MethodManager();
            methodManager.DeleteUser(userID);
            return Json(new { success = true });
        }

        [Authorize]
        public ActionResult EditProfile()
        {
            string userName = User.Identity.Name;
            MethodManager methodManager  = new MethodManager ();
            UserDetailView userDetailView  = methodManager.GetUserProfile(methodManager.GetUserID(userName));
            return View(userDetailView);
        }

        [HttpPost]
        [Authorize]
        public ActionResult EditProfile(UserDetailView userDetailView )
        {
            if (ModelState.IsValid)
            {
                MethodManager methodManager   = new MethodManager ();
                methodManager.UpdateUserAccount(userDetailView );

                ViewBag.Status = "Update Sucessful!";
            }
            return View(userDetailView );
        }


Now add partial View for Controller ManageUserPartial
@model StoreManagementSystem.Models.PropertiesForView.UserDataView

<span class="alert-success">@ViewBag.Message</span>
<div>
    <h1>List of Users</h1>
    <span class="alert-success">
        @ViewBag.Message
    </span>
    <table class="table table-striped table-condensed table-hover">
        <thead>
            <tr>
                <th>ID</th>
                <th>User Name</th>
                <th>Password</th>
                <th>First Name</th>
                <th>Last Name</th>
                <th>Gender</th>
                <th colspan="2">Role</th>
                <th></th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var m in Model.userDetailViews)
            {
                <tr>
                    <td>@Html.DisplayFor(b => m.UserID)</td>
                    <td>@Html.DisplayFor(b => m.UserName)</td>
                    <td> @Html.DisplayFor(b => m.Password)</td>
                    <td> @Html.DisplayFor(b => m.FirstName)</td>
                    <td> @Html.DisplayFor(b => m.LastName)</td>
                    <td> @Html.DisplayFor(b => m.Gender)</td>
                    <td> @Html.DisplayFor(b => m.RoleName)</td>
                    <td> @Html.HiddenFor(b => m.RoleID)</td>
                    <td><a href="javacript:void(0)" class="lnkEdit">Edit</a></td>
                    <td><a href="javacript:void(0)" class="lnkDelete">Delete</a></td>
                </tr>}
        </tbody>
    </table>
</div>
@* Edit View Partial*@


<div id="divEdit" style="display:none">
    <input type="hidden" id="hidID" />
    <table>
        <tr>
            <td>User Name</td>
            <td><input type="text" id="txtUserName" class="form-control" /></td>
        </tr>
        <tr>
            <td>Password</td>
            <td><input type="text" id="txtPassword" class="form-control" /></td>
        </tr>
        <tr>
            <td>First Name</td>
            <td><input type="text" id="txtFirstName" class="form-control" /></td>
        </tr>
        <tr>
            <td>Last Name</td>
            <td><input type="text" id="txtLastName" class="form-control" /></td>
        </tr>
        <tr>
            <td>Gender</td>
            <td>
                @Html.DropDownListFor(m => m.UserGender.SelectedGender,
           new SelectList(Model.UserGender.Gender, "Value", "Text"), "",
           new { id = "ddlGender", @class = "form-control" })
            </td>
        </tr>
        <tr>
            <td>Role</td>
            <td>
                @Html.DropDownListFor(m => m.UserRoles.SelectedRoleID,
           new SelectList(Model.UserRoles.userRoleDetails, "RoleID", "RoleName"),                         "",                         new { id = "ddlRoles", @class="form-control" })
            </td>
        </tr>
    </table>
</div>
<span class="alert-success">@ViewBag.Message</span>

<script type="text/javascript">
     $(function () {

         var initDialog = function (type)
         {
             var title = type;
             $("#divEdit").dialog({
                 autoOpen: false,
                 modal: true,
                 title: type + ' User',
                 width: 360,
                 buttons: {
                     Save: function () {
                         var id = $("#hidID").val();
                         var role = $("#ddlRoles").val();
                         var loginName = $("#txtUserName").val();
                         var loginPass = $("#txtPassword").val();
                         var fName = $("#txtFirstName").val();
                         var lName = $("#txtLastName").val();
                         var gender = $("#ddlGender").val();

                         UpdateUser(id, loginName, loginPass, fName, lName, gender, role);
                         $(this).dialog("destroy");

                     },
                     Cancel: function () { $(this).dialog("destroy"); }
        }
        });
             }

         function UpdateUser(id, logName, logPass, fName, lName, gender, role) {
             $.ajax({
                 type: "POST",
                 url: "@(Url.Action("UpdateUserData","Home"))",
                 data: {
                     userID: id, loginName: logName, password: logPass, firstName:
                         fName, lastName: lName, gender: gender, roleID: role
                 },
                 success: function (data) {
                     $("#divUserListContainer").load("@(Url.Action("ManageUserPartial","Home", new { status
                                                      ="update" }))");

                 },
                 error: function (error) {
                     //to do:
                 }
             });
         }

         $("a.lnkEdit").on("click", function () {
             initDialog("Edit");
             $(".alert-success").empty();
             row = $(this).closest('tr');

             $("#hidID").val(row.find("td:eq(0)").html().trim());
             $("#txtUserName").val(row.find("td:eq(1)").html().trim())
             $("#txtPassword").val(row.find("td:eq(2)").html().trim())
             $("#txtFirstName").val(row.find("td:eq(3)").html().trim())
             $("#txtLastName").val(row.find("td:eq(4)").html().trim())
             $("#ddlGender").val(row.find("td:eq(5)").html().trim())
             $("#ddlRoles").val(row.find("td:eq(7) > input").val().trim());

             $("#divEdit").dialog("open");
             return false;
         });
     });

   
    function DeleteUser(id) {
        $.ajax({
            type: "POST",
            url: "@(Url.Action("DeleteUser","Home"))",
            data: { userID: id },
            success: function (data) {
                $("#divUserListContainer").load("@(Url.Action("ManageUserPartial","Home",
                                                 new { status ="delete" }))");
            }, error: function (error) { }
        });
    }

    $("a.lnkDelete").on("click", function () {
        var row = $(this).closest('tr');
        var id = row.find("td:eq(0)").html().trim();
        var answer = confirm("You are about to delete this user with ID "
            + id + " . Continue?");
        if (answer)
            DeleteUser(id);
        return false;
    });
</script>

No comments:

Post a Comment