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를 사용자의 이름과 성으로 표시하려면 드롭 다운 목록을 가져와야합니다. 누군가가 현재의 방법으로 그것을 달성하려고 시도하는 대신 대체 솔루션을 가지고 있다면 나도 시도해 볼 수 있습니다.
미리 감사드립니다 :)
나는 문제를 해결할 수 있었다. 절대적인 최선의 해결책은 아니지만 작동하는 것 같습니다. 여기에 해결책이 있습니다. 위 코드의 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] 삭제
몇 마디 만하겠습니다