ASP.NET MVC 5 및 ID (Entity Framework 코드 우선)에서 사용자를 다른 사용자에 연결하려면 어떻게해야합니까?

M. 안토니

ASP.NET MVC 5 및 Entity Framework 코드 우선 접근 방식의 ASP.NET ID에서 사용자를 다른 사용자에 연결하는 데 도움이 필요합니다.

여기서 사용 사례는 사용자를 생성 할 때 사용자의 이름과 성을 표시하는 ReportsTo 드롭 다운 목록에서 사용자를 선택하고 ID 사용자 테이블의 내 ReportsTo 열에 선택한 사용자의 ID를 저장해야하는 경우입니다. 이 사용자 목록은 데이터베이스에있는 기존 Identity 사용자 목록이어야합니다.

다양한 주제를 구현하고 내 사용자가보기를 만들고 편집 할 때 ID 사용자와 함께 표시 할 드롭 다운 목록을 가져 왔습니다. 데이터베이스의 내 ReportsTo 열에 ID를 저장하지만 사용자를 편집 할 때 드롭 다운 목록에서 동일한 항목을 다시 선택하지 않는 한 ReportsTo 필드는 데이터베이스에 저장된 ID를 유지하지 않습니다 (이전에 저장 한 값을 편집보기에서 이전에 저장된 값을로드하지 않으므로 다시 선택하지 않으면 비어 있고, 세부 정보 페이지와 내 사용자 목록 테이블에 ReportsTo 저장된 사용자가 GUID로 표시됩니다.

내 사용자 컨트롤러에서 :

public UserController()
        {
            using (var userList = new ApplicationDbContext())
            {
                ViewBag.ReportsTo = userList.Users.Select(user => new SelectListItem { Text = user.FirstName + " " + user.LastName, Value = user.Id }).ToList();
            }
        } 

public ActionResult Create()
        {
            // Show a list of available groups:
            ViewBag.GroupsList =
                new SelectList(this.GroupManager.Groups, "Id", "Name");
            return View();
        } 

[HttpPost]
        public async Task<ActionResult> Create(RegisterViewModel userViewModel, params string[] selectedGroups)
        {
            if (ModelState.IsValid)
            {
                var user = new ApplicationUser
                {
                    UserName = userViewModel.Email,
                    FirstName = userViewModel.FirstName,
                    LastName = userViewModel.LastName,
                    ReportsTo = userViewModel.ReportsTo,
                    OfficeNumber = userViewModel.OfficeNumber,
                    CellNumber = userViewModel.CellNumber,
                    Email = userViewModel.Email
                };
                var adminresult = await UserManager
                    .CreateAsync(user, userViewModel.Password);

                //Add User to the selected Groups 
                if (adminresult.Succeeded)
                {
                    if (selectedGroups != null)
                    {
                        selectedGroups = selectedGroups ?? new string[] { };
                        await this.GroupManager
                            .SetUserGroupsAsync(user.Id, selectedGroups);
                    }
                    return RedirectToAction("Users");
                }
            }
            ViewBag.Groups = new SelectList(
                await RoleManager.Roles.ToListAsync(), "Id", "Name");
            return View();
        } 

public async Task<ActionResult> Edit(string id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            var user = await UserManager.FindByIdAsync(id);
            if (user == null)
            {
                return HttpNotFound();
            }

            // Display a list of available Groups:
            var allGroups = this.GroupManager.Groups;
            var userGroups = await this.GroupManager.GetUserGroupsAsync(id);

            var model = new EditUserViewModel()
            {
                Id = user.Id,
                Email = user.Email,
                FirstName = user.FirstName,
                LastName = user.LastName,
                ReportsTo = user.ReportsTo,
                OfficeNumber = user.OfficeNumber,
                CellNumber = user.CellNumber
            };

            foreach (var group in allGroups)
            {
                var listItem = new SelectListItem()
                {
                    Text = group.Name,
                    Value = group.Id,
                    Selected = userGroups.Any(g => g.Id == group.Id)
                };
                model.GroupsList.Add(listItem);
            }
            return View(model);
        } 

[HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Edit(
            [Bind(Include = "Email,Id,FirstName,LastName,ReportsTo,OfficeNumber,CellNumber")] EditUserViewModel editUser,
            params string[] selectedGroups)
        {
            if (ModelState.IsValid)
            {
                var user = await UserManager.FindByIdAsync(editUser.Id);
                if (user == null)
                {
                    return HttpNotFound();
                }

                // Update the User:
                user.UserName = editUser.Email;
                user.Email = editUser.Email;
                user.FirstName = editUser.FirstName;
                user.LastName = editUser.LastName;
                user.ReportsTo = editUser.ReportsTo;
                user.OfficeNumber = editUser.OfficeNumber;
                user.CellNumber = editUser.CellNumber;
                await this.UserManager.UpdateAsync(user);

                // Update the Groups:
                selectedGroups = selectedGroups ?? new string[] { };
                await this.GroupManager.SetUserGroupsAsync(user.Id, selectedGroups);
                return RedirectToAction("Users");
            }
            ModelState.AddModelError("", "Something failed.");
            return View();
        } 

내 EditUserViewModel :

public class EditUserViewModel
    {
        public EditUserViewModel()
        {
            this.RolesList = new List<SelectListItem>();
            this.GroupsList = new List<SelectListItem>();
        }
        public string Id { get; set; }

        [Required(AllowEmptyStrings = false)]
        [Display(Name = "Email")]
        [EmailAddress]
        public string Email { get; set; }
        public string FirstName { get; set; }

        [Display(Name = "Last Name")]
        public string LastName { get; set; }

        [Display(Name = "Reports To")]
        public string ReportsTo { get; set; }

        [Display(Name = "Office Number")]
        public string OfficeNumber { get; set; }

        [Display(Name = "Cell Number")]
        public string CellNumber { get; set; }

        [Display(Name = "ProfilePicture")]
        public byte[] ProfilePicture { get; set; }

        public ICollection<SelectListItem> RolesList { get; set; }

        public ICollection<SelectListItem> GroupsList { get; set; }
    } 

내 만들기 및 편집보기의 드롭 다운 목록

@Html.DropDownList("ReportsTo", ViewBag.Users as SelectList, "Choose User", htmlAttributes: new { @class = "form-control" }) 

편집보기에서 현재 저장된 값을 검색하고 색인 및 세부 정보보기에 GUID를 사용자의 이름과 성으로 표시하려면 드롭 다운 목록을 가져와야합니다. 누군가가 현재의 방법으로 그것을 달성하려고 시도하는 대신 대체 솔루션을 가지고 있다면 나도 시도해 볼 수 있습니다.

미리 감사드립니다 :)

M. 안토니

나는 문제를 해결할 수 있었다. 절대적인 최선의 해결책은 아니지만 작동하는 것 같습니다. 여기에 해결책이 있습니다. 위 코드의 ReportsTo를 솔루션의 SuperiorID로 대체했습니다. 내 ID 사용자는 기본 ID 구현과 같은 GUID가 아닌 ID에 대한 정수를 가지고 있습니다.

아래 코드를 사용하여 ID 사용자를 다른 ID 사용자와 연결했습니다.

내 ID 모델에서 ApplicationUser : Identity User 클래스에 다음이 있습니다.

public class ApplicationUser : IdentityUser<int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>, IUser<int>
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int? SuperiorID { get; set; }
        public string FullName
        {
            get
            {
                return FirstName + " " + LastName;
            }
        } 

        public async Task<ClaimsIdentity>
            GenerateUserIdentityAsync(UserManager<ApplicationUser, int> manager)
        {
            var userIdentity = await manager
                .CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            return userIdentity;
        }

        public virtual ApplicationUser Superior { get; set; }

    } 

본인은 본인의 신원 모델에 배치 한 사용자의 ID와 전체 이름을 얻을 수 있도록 신원 사용자를 상속하는 상급자를위한 초록을 만들었습니다.

public abstract class Superior : IdentityUser
    {

    } 

사용자 생성시 Superior를 추가 할 수 있도록 RegisterViewModel에 다음을 추가했습니다.

public class RegisterViewModel
    {
        [Display(Name = "First Name")]
        public string FirstName { get; set; }

        [Display(Name = "Last Name")]
        public string LastName { get; set; }

        public string FullName
        {
            get
            {
                return FirstName + " " + LastName;
            }
        }

        [Display(Name = "Superior")]

        public virtual ApplicationUser Superior { get; set; }

    } 

편집 뷰에서 사용자의 Superior를 편집 할 수 있도록 EditUserViewModel에 다음을 추가했습니다.

public class EditUserViewModel
    {
        public int Id { get; set; }

        [Display(Name = "First Name")]
        public string FirstName { get; set; }

        [Display(Name = "Last Name")]
        public string LastName { get; set; }

        public string FullName
        {
            get
            {
                return FirstName + " " + LastName;
            }
        }

        [Display(Name = "Superior")]
        public int? SuperiorID { get; set; }

        public virtual ApplicationUser Superior { get; set; }

    } 

다음은 UserController의 코드입니다. 나는 이것과 관련이없는 코드를 제거하고 코드가 어디로 가야하는지 표시하기 위해 몇 가지 코드를 남겼습니다.

이것은 메인 클래스에 있습니다.

private ApplicationDbContext db = new ApplicationDbContext(); 


public async Task<ActionResult> Index(int? SelectedSuperior)
        {
            var superiors = db.Users.OrderBy(s => s.FirstName).ToList();
            ViewBag.SelectedSuperior = new SelectList(superiors, "Id", "FullName", SelectedSuperior);
            int superiorID = SelectedSuperior.GetValueOrDefault();

            IQueryable<ApplicationUser> users = db.Users
                .Where(c => !SelectedSuperior.HasValue || c.SuperiorID == superiorID)
                .OrderBy(d => d.Id)
                .Include(d => d.Superior);
            var sql = users.ToString();

            return View(await UserManager.Users.ToListAsync());
        } 

public ActionResult Create()
        {
            PopulateSuperiorsDropDownList();
            return View();
        } 

public async Task<ActionResult> Create(RegisterViewModel userViewModel)
        {
            if (ModelState.IsValid)
            {
                var user = new ApplicationUser
                {
                    FirstName = userViewModel.FirstName,
                    LastName = userViewModel.LastName,
                    SuperiorID = userViewModel.SuperiorID,
                };

            }
            PopulateSuperiorsDropDownList(userViewModel.SuperiorID);
            return View();
        } 

public async Task<ActionResult> Edit(int id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            var user = await UserManager.FindByIdAsync(id);
            if (user == null)
            {
                return HttpNotFound();
            }

            var model = new EditUserViewModel()
            {
                Id = user.Id,
                FirstName = user.FirstName,
                LastName = user.LastName,
                SuperiorID = user.SuperiorID,
            };
            PopulateSuperiorsDropDownList(user.SuperiorID);
            return View(model);
        } 

public async Task<ActionResult> Edit([Bind(Include = "Email,Id,FirstName,LastName,SuperiorID")] EditUserViewModel editUser)
        {
            if (ModelState.IsValid)
            {
                var user = await UserManager.FindByIdAsync(editUser.Id);
                if (user == null)
                {
                    return HttpNotFound();
                }

                // Update the User:
                user.Email = editUser.Email;
                user.FirstName = editUser.FirstName;
                user.LastName = editUser.LastName;
                user.SuperiorID = editUser.SuperiorID;
            }
            ModelState.AddModelError("", "Something failed.");
            PopulateSuperiorsDropDownList(editUser.SuperiorID);
            return View();
        } 

private void PopulateSuperiorsDropDownList(object selectedSuperior = null)
        {
            var superiorsQuery = from s in db.Users
                                   orderby s.FirstName + " " + s.LastName
                                   select s;
            ViewBag.SuperiorID = new SelectList(superiorsQuery, "Id", "FullName", selectedSuperior);
        } 

다음은 Superior가 사용자에게 할당 될 수 있도록 뷰를 만들고 편집하기위한 드롭 다운 목록입니다.

@Html.DropDownList("SuperiorID", null, "Choose Superior", htmlAttributes: new { @class = "form-control" }) 

세부 정보 페이지에 사용자의 상급자의 전체 이름을 표시하기 위해 아래 코드를 사용합니다.

@Html.TextBoxFor(m => m.Superior.FullName, new { @class = "form-control", @disabled = "disabled" }) 

내 인덱스 페이지의 데이터 테이블에 사용자 상급자의 전체 이름을 표시하기 위해 아래 방법을 사용했습니다.

<table class="table" id="users-table" width="100%">
                    <thead>
                        <tr>
                            <th title="First Name">
                                First Name
                            </th>
                            <th title="Last Name">
                                Last Name
                            </th>
                            <th title="Superior">
                                Superior
                            </th>
                        </tr>
                    </thead>
                    <tbody>
                        @foreach (var item in Model)
                        {
                            <tr>
                                <td>
                                    @Html.DisplayFor(modelItem => item.FirstName)
                                </td>
                                <td>
                                    @Html.DisplayFor(modelItem => item.LastName)
                                </td>
                                <td>
                                    @Html.DisplayFor(modelItem => item.Superior.FullName)
                                </td>
                            </tr>
                        }
                    </tbody>
</table> 

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

TOP 리스트

  1. 1

    Ionic 2 로더가 적시에 표시되지 않음

  2. 2

    JSoup javax.net.ssl.SSLHandshakeException : <url>과 일치하는 주체 대체 DNS 이름이 없습니다.

  3. 3

    std :: regex의 일관성없는 동작

  4. 4

    Xcode10 유효성 검사 : 이미지에 투명성이 없지만 여전히 수락되지 않습니까?

  5. 5

    java.lang.UnsatisfiedLinkError : 지정된 모듈을 찾을 수 없습니다

  6. 6

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  7. 7

    상황에 맞는 메뉴 색상

  8. 8

    SMTPException : 전송 연결에서 데이터를 읽을 수 없음 : net_io_connectionclosed

  9. 9

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  10. 10

    Windows cmd를 통해 Anaconda 환경에서 Python 스크립트 실행

  11. 11

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  12. 12

    C #에서 'System.DBNull'형식의 개체를 'System.String'형식으로 캐스팅 할 수 없습니다.

  13. 13

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  14. 14

    Cassandra에서 버전이 지정된 계층의 효율적인 모델링

  15. 15

    복사 / 붙여 넣기 비활성화

  16. 16

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  17. 17

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  18. 18

    SQL Server-현명한 데이터 문제 받기

  19. 19

    Seaborn에서 축 제목 숨기기

  20. 20

    ArrayBufferLike의 typescript 정의의 깊은 의미

  21. 21

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

뜨겁다태그

보관